使用GCC在Windows上編譯。它立即與Exception Code: c00000fd
墜毀。爲什麼int main(){return main(); }導致stackoverflow而不是尾遞歸?
編輯:試着編譯下面的代碼(對於可見輸出),它會導致stackoverflow。
#include<stdio.h>
int main(void)
{
printf("Hello World\n");
return main();
}
輸出 -
>gcc trailORoverflow.c -o trailORoverflow.exe
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
它使打印的Hello World的某個時候和崩潰。
編輯:未碰撞O2
,O3
和-O1 -foptimize-sibling-calls
優化。
也許正確的答案與尾調用遞歸有關。 iirc GCC將實施尾部呼叫遞歸,即在可能的情況下優化遞歸呼叫 – dreadiscool
因爲C標準不需要特定的優化。 (它甚至不需要爲局部變量使用堆棧)。並使用正確的原型風格的函數聲明器:'main(void)'。 – Olaf
用不同的優化標誌試試gcc肯定有意義,可能某些組合會給你無限循環,你想要 –