我正在尝试通过另一个调用函数来修改局部变量的值,但是我无法弄清楚推送到堆栈的所有值.
#include <stdio.h> #include <string.h> void fun() { int i; int *p=&i; int j; for(j=0;*(p+j)!=10;j++); printf("%d",j); /* Stack Frame size is j int pointers. */ *(p+j)=20; } main() { int i=10; fun(); printf("\n %d \n",i); }
j在fun()等于12?我试图理解什么值被推到堆栈.更具体地说,我们可以在fun()中使用for()循环来改变main()中的i的值,并且可以预测fun()中的j的值吗?
解决方法
当您必须从其他函数调用访问本地变量时,我认为您最好重新设计代码.
理论上,如果您可以完全了解编译器如何处理运行时堆栈上的函数调用的激活记录,则可以直接修改fun()中的main()的i.有关详细信息,请参阅“编译器:原理,技巧和工具”(http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/0321486811)
j的值取决于int i之间的运行时堆栈地址;在fun()和int i = 10;在main()中.在这种情况下,当调用fun()时,它们在堆栈上的相对距离只是12.这就是为什么j为12.因此*(p j)= 20;实际上改变了我的main().如果您通过添加int a = 14更改代码;如下所示,您将发现更改了运行时堆栈上激活记录的j值.
#include <stdio.h> void fun() { int i; int *p=&i; int j; for(j=0;*(p+j)!=10;j++); printf("%d",j); /* Stack Frame size is j int pointers. */ *(p+j)=20; } main() { int i=10; int a=14; /* add this for example to change the relative address i in the main and i in the fun*/ fun(); printf("\n %d \n",i); }