【发布时间】:2016-09-15 09:54:50
【问题描述】:
使用 GCC 在 Windows 上编译。它立即与Exception Code: c00000fd 崩溃。
编辑:尝试编译以下代码(用于可见输出),它会导致堆栈溢出。
#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 将实现尾调用递归,即尽可能优化递归调用
-
因为 C 标准不需要特定的优化。 (它甚至不需要为局部变量使用堆栈)。并使用正确的原型风格函数声明器:
main(void)。 -
用不同的优化标志尝试 gcc 绝对是有意义的,可能一些组合会给你你想要的无限循环
-
使用
-O2、-O3或-O1 -foptimize-sibling-calls -
gcc 默认不执行尾递归优化,可能是因为它使程序在异常后更难调试和展开。因此,您未优化的程序每次调用时都会占用一些堆栈空间(
callq main后跟push %rbp),直到达到操作系统施加的限制。优化的程序会执行类似jmp main的操作。我在 Windows 上没有 gcc,因此无法提供全面的答案,但其他人会这样做。
标签: c gcc stack-overflow tail-recursion