递归main() – 为什么会出现段错误?

为什么以下程序会出现段错误?

int main() { main(); } 

即使它是一个没有结束的递归,因此根据定义也是无效的,我不明白它为什么是segfaults(gcc 4.4.3和clang 1.5(trunk))。

因为每次它自己调用它都会分配一点堆栈空间; 最终它耗尽了堆栈空间和段错误。 不过,我对于一个段错误感到有些惊讶; 我本来期望(鼓滚) 堆栈溢出 !

你得到一个堆栈溢出 (!)

 int main() { main(); } 

会导致堆栈溢出。

但,

这样的优化版本(不是调试模式):

 int main() { return main(); } 

将在尾递归调用中转换递归,即无限循环!

没有基本情况就会递归,导致堆栈溢出

它会导致堆栈溢出,在系统上被诊断为段错误。

每个函数调用在堆栈中添加entires,当函数退出时,这些条目将从堆栈中删除。 这里我们有递归函数调用,它没有退出条件。 所以它是一个接一个的无限数量的函数调用,这个函数永远不会退出,并且从未从堆栈中删除,它将导致堆栈溢出。