我担心自己对 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之间只相差了一个整数,就好像从未回收过temp1一样。我期望堆栈中应该包含20和25。然后将temp1放在堆栈顶部,将其移除,再将temp2放在堆栈顶部,最后将其移除。
我正在Mac OS X上使用gcc编译器。
注意,我正在使用-O0标志进行编译,以避免优化。
对于那些想了解本问题背景的人:我正在准备C语言教材,试图向学生展示他们不仅应该避免从函数返回自动变量的指针,还应该避免在嵌套块中获取变量的地址并在外部进行解引用。我试图演示这会导致问题,但无法获得截图。