我正在尝试在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。 为什么会这样?
答案 0 :(得分:6)
每个嵌套函数调用都会消耗一些堆栈空间用于参数和返回地址。在您的代码中,嵌套函数调用是无界的,因此它们消耗了无数的堆栈。堆栈用完后,程序将继续在分配给进程的内存之外写入返回地址,然后崩溃。
由于tail call optimization,取决于编译器,打开优化可能会有所帮助。
答案 1 :(得分:3)
您遇到的行为称为堆栈溢出。这意味着,调用堆栈包含太多项目,并且溢出(没有剩余空间可以继续执行),并且程序因SIGSEGV而崩溃。没有退出例程,因此不可避免地会发生这种情况。