在函数调用期间什么值被推入堆栈?

在函数调用期间什么值被推入堆栈?,第1张

概述我正在尝试通过另一个调用函数来修改局部变量的值,但是我无法弄清楚推送到堆栈的所有值. #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 我正在尝试通过另一个调用函数来修改局部变量的值,但是我无法弄清楚推送到堆栈的所有值.
#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);}@H_404_3@  

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);}@H_404_3@                  总结       

以上是内存溢出为你收集整理的在函数调用期间什么值被推入堆栈?全部内容,希望文章能够帮你解决在函数调用期间什么值被推入堆栈?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1253617.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存