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

时间:2019-05-12 13:36:25

标签: 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
}

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

2 个答案:

答案 0 :(得分:6)

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

由于tail call optimization,取决于编译器,打开优化可能会有所帮助。

答案 1 :(得分:3)

您遇到的行为称为堆栈溢出。这意味着,调用堆栈包含太多项目,并且溢出(没有剩余空间可以继续执行),并且程序因SIGSEGV而崩溃。没有退出例程,因此不可避免地会发生这种情况。