在函数调用期间将哪些值压入堆栈?

deb*_*air 10 c pointers

我试图通过另一个被调用的函数修改局部变量的值,但我无法弄清楚所有值被推入堆栈的是什么.

#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);
}
Run Code Online (Sandbox Code Playgroud)

究竟如何jfun()等于12?我试图了解什么值被推入堆栈.更具体地说,我们可以imain()不使用for循环的情况下更改其中的值,fun()是否可以预测j内部的值fun()

Yul*_* Ao 3

当您必须从其他函数调用访问局部变量时,我认为您最好重新设计代码。

理论上,如果你能完全理解编译器如何处理运行时堆栈上函数调用的激活记录,就可以直接修改of iin main()fun()详细内容可以阅读《编译器:原理、技术和工具》(http://www.amazon.com/Compilers-Principles-Techniques-Tools-Edition/dp/0321486811

在此输入图像描述

int i;j 的值取决于fun() 和int i = 10;main()之间的运行时堆栈地址。在这种情况下,当调用 fun() 时,它们在堆栈上的相对距离仅为 12。这就是为什么 是j12。所以*(p + j) = 20;实际上改变了imain() 的 。如果您通过添加以下内容来更改代码,您将发现运行时堆栈上激活记录的changedint 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);
}
Run Code Online (Sandbox Code Playgroud)