关于函数堆栈的问题请教...
程序员文章站
2024-03-24 14:17:46
...
最近一直在学习函数调用时堆栈的变化情况,自己写了一个简单的程序:
#include <stdio.h>
#include <string.h>
int localFun(char,char,char,char,char);
int main(int argc,char* argv[])
{
if(1==1)
{
char c1,c2;
scanf("%c",&c1);
printf("c1=%c\r\n",c1);
scanf("%c",&c2);
printf("c2=%c\r\n",c2);
localFun(c1,c2,'A','$','-');
printf("Main End!\r\n");
}
return 0;
}
int localFun(char var1, char var2, char varA, char varB, char varC)
{
char var3='s';
char strVar[3];
//scanf("%c",var3);
printf("input value of strVar:\r\n");
scanf("%s",strVar);
printf("Value is input!\r\n");
char* p0=&var3;
printf("var1=%c;var2=%c,var3=%c,strVar=%s\r\n",var1,var2,var3,strVar);
printf("pvar1=%p;pvar2=%p,pvar3=%p,strVar=%p\r\n",&var1,&var2,&var3,strVar);
printf("var1=%c;var2=%c,var3=%c,strVar=%s\r\n",var1,var2,var3,strVar);
printf("\r\n");
char* p=&var3;
printf("p=%p;p+1=%p,p+2=%p,p+3=%p\r\n",p,p+1,p+2,p+3);
printf("*p=%c;*(p+1)=%c,*(p+2)=%c,*(p+5)=%c,p+5=%s\r\n",*p,*(p+1),*(p+2),*(p+5),p+5);
for(int i=0;i<299;i++)
{
if(*(p+i)==var1||*(p+i)==var2||*(p+i)==varA||*(p+i)==varB||*(p+i)==varC)
{
printf("*(p+%d)=%c,addr=%p,pvar1=%p,pvar2=%p\r\n",i,*(p+i),p+i,&var1,&var2);
}
}
return 0;
}
在VMware虚拟机里编译:
运行32位程序结果:
按照网上说的函数调用时,堆栈变化情况应该是这样:
(图片来自网络)
一直搞不明白:运行结果中,堆栈从(p+1)到(p+40)都是什么内容。难道main函数调用子函数时压入堆栈的EIP有40个字节?
在此恳求哪位大神给指点一二,不胜感激!
虚拟机:VMware® Workstation 14 Pro
虚拟操作系统:Deepin 15.4(64位)
上一篇: 请教大神关于 Django 自动发邮件时候的 CSRF 问题
下一篇: 虚拟内存管理
推荐阅读
-
关于函数堆栈的问题请教...
-
求助:关于openpyxl使用的一些问题
-
请教大神关于 Django 自动发邮件时候的 CSRF 问题
-
Extjs中关于使用分组表格控件之后无法获取对应的行记录问题。 博客分类: Extjs Extjsgrid
-
关于MFC中AfxGetApp函数是怎么得到全局对象的指针的简要分析
-
优化Spring启动速度的问题!!
SpringHibernateHSQLDBXMLJDBC">
关于
优化Spring启动速度的问题!! SpringHibernateHSQLDBXMLJDBC -
关于Hsql无法插入的问题 博客分类: 数据库 HSQL
-
关于继承中(静态方法+私有方法)的覆盖与重写问题
-
关于js函数 形参和局部变量名相同 的问题
-
(转)关于两个jar包中存在包名和类名都完全相同的问题 博客分类: Java javajareclipse