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

时间:2010-03-23 11:24:49

标签: c segmentation-fault stack-overflow

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

int main() { main(); }

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

6 个答案:

答案 0 :(得分:35)

你得到stack overflow(!)

答案 1 :(得分:26)

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

答案 2 :(得分:10)

int main() { main(); }

会导致堆栈溢出。

但是,

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

int main() {
   return main();
}

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

答案 3 :(得分:3)

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

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