为什么以下程序会出现段错误?
int main() { main(); }
即使它是一个没有结束的递归,因此根据定义也是无效的,我不明白它为什么是segfaults(gcc 4.4.3和clang 1.5(trunk))。
答案 0 :(得分:35)
你得到stack overflow(!)
答案 1 :(得分:26)
因为每次它自己调用它都会分配一点堆栈空间;最终它耗尽了堆栈空间和段错误。不过,我对于段错误感到有些惊讶;我本来期待的(鼓声)stack overflow!
答案 2 :(得分:10)
int main() { main(); }
会导致堆栈溢出。
但是,
这样的优化版本(不是调试模式):
int main() {
return main();
}
将在尾递归调用中转换递归,也称为无限循环!
答案 3 :(得分:3)
它没有基本情况递归,导致堆栈溢出
答案 4 :(得分:2)
它会导致堆栈溢出,在系统上被诊断为段错误。
答案 5 :(得分:1)
每个函数调用在堆栈中添加entires,当函数退出时,这些条目将从堆栈中删除。 这里我们有递归函数调用,它没有退出条件。所以它的一个接一个的函数调用数量无穷大,这个函数永远不会退出,并且从未从堆栈中删除,这将导致堆栈溢出。