为什么两个函数中的C程序在Linux上递归调用会产生分段错误?

she*_*yar -1 c linux recursion

我正在尝试在Linux上编译以下C代码:

#include <stdio.h>
/////
void func1();
void func2();
//////
void func1()
{
  func2();
}
void func2()
{
  func1();
}
int main()
{
  func1();//call to function 1
}
Run Code Online (Sandbox Code Playgroud)

如果我没有记错的话,该程序应该无限执行,但是当我在Linux上编译并运行它时,就会出现Segmentation Fault。为什么会这样呢?

use*_*342 6

每个嵌套函数调用都会占用一些用于参数和返回地址的堆栈空间。在您的代码中,嵌套函数调用是无界的,因此它们消耗了无数的堆栈。一旦堆栈用完,程序将继续在分配给进程的内存之外写入返回地址并崩溃。

取决于编译器,由于尾调用优化,打开优化可能会有所帮助。