我担心我误解了C中的堆栈行为.
假设我有以下代码:
int main (int argc, const char * argv[])
{
int a = 20, b = 25;
{
int temp1;
printf("&temp1 is %ld\n" , &temp1);
}
{
int temp2;
printf("&temp2 is %ld\n" , &temp2);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我在两个打印输出中都没有获得相同的地址?我得到的temp2离temp1只有一个int,好像temp1从未被回收过.
我的期望是堆栈包含20和25.然后将temp1放在顶部,然后将其删除,然后将temp2放在顶部,然后将其删除.
我在Mac OS X上使用gcc.
请注意,我使用-O0标志进行编译而不进行优化.
那些想知道这个问题的背景的人:我正在准备关于C的教材,我试图向学生们展示他们不仅应该避免从函数返回指向自动变量的指针,而且还要避免从中获取变量的地址嵌套块并在外部取消引用它们.我试图证明这是如何导致问题的,并且无法获得截图.