在this presentation的幻燈片137-140中,有人提到bar()甚至foo()被編譯爲本示例程序的內聯函數,導致打印輸出爲42在正常生產中,即使它在技術上應該是垃圾。你碰巧知道爲什麼當優化器啓動時輸出的垃圾如預期的那樣?正常和優化版本之間的正確返回值
我已經包含的源代碼
#include <stdio.h>
void foo(void)
{
int a;
printf("%d\n", a);
}
void bar(void)
{
int a = 42;
}
int main(void)
{
bar();
foo();
return 0;
}
和用於參考的命令提示打印輸出。
$ cc foo.c && ./a.out
42
$ cc -O foo.c && ./a.out
1606415608
在此先感謝您的解釋。
bar()將var a放在堆上。由於var只是本地的,所以從堆中刪除。之後,foo()在堆上使用相同的地址。因此42仍在那裏。希望我沒有犯任何重大錯誤,但我認爲我是正確的。 – cen
@cen:所以實際上,var a不是放在棧上,而是放在堆上? – stanigator
它應該在堆棧上。局部變量始終在堆棧上。 – nhahtdh