加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:11:21 所属栏目:百科 来源:网络整理
导读:我正在尝试通过另一个调用函数来修改局部变量的值,但是我无法弄清楚推送到堆栈的所有值. #include stdio.h#include string.hvoid 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+
我正在尝试通过另一个调用函数来修改局部变量的值,但是我无法弄清楚推送到堆栈的所有值.
#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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读