我担心我对 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;
}
为什么我在两个打印输出中没有得到相同的地址?我得到 temp2 与 temp1 相差一个 int,就好像 temp1 从未被回收一样。
我的期望是堆栈包含 20 和 25。然后将 temp1 放在顶部,然后将其移除,然后将 temp2 放在顶部,然后将其移除。
我在 Mac OS X 上使用 gcc。
请注意,我使用 -O0 标志进行编译而不进行优化。
那些想知道这个问题的背景的人:我正在准备关于 C 的教材,我试图向学生展示他们不仅应该避免从函数返回指向自动变量的指针,还应该避免从函数中获取变量的地址嵌套块并在外部取消引用它们。我试图演示这如何导致问题,但无法获取屏幕截图。