这是我老师的代码:
#include <stdio.h>
void foo1(int xval){
int x;
x = xval;
printf("Address of x: %p\nValue of x: %d\n", &x, x);
}
void foo2(int dummy){
int y;
printf("Address of y: %p\nValue of y: %d\n", &y, y);
}
int main(void){
foo1(7);
foo2(11);
return 0;
}
这是产生的输出:
任何人都可以解释我为什么?
答案 0 :(得分:2)
stack after call stack after call
to foo1() to foo2()
+----------------+ +----------------+ |
| stack frame of | | stack frame of | |
| main() | | main() | v
++++++++++++++++++ <-- same addr --> ++++++++++++++++++ stack
| stack frame of | | stack frame of | growth
| foo1() | | foo2() |
+----------------+ +----------------+
现在foo1()的堆栈帧中x的地址与foo2()的堆栈帧中y的地址相同。
这是因为两个函数具有相同数量和类型的参数和局部变量(被推入堆栈)。在调用foo1()时,x的地址中的值(在您的情况下为0x7fff63387a84)设置为7.由于foo1()和foo2()之间没有其他函数调用,此值仍然存在。
注意此答案仅供您理解。你不应该依赖于y的值,因为它是未初始化的(如前面的评论中所指出的)。这仅仅是一种意外现象。我建议你了解堆栈框架是如何形成的。