解决堆栈溢出错误时遇到麻烦

Trouble resolving stack overflow error

本文关键字:遇到 麻烦 错误 堆栈 栈溢出 解决      更新时间:2023-10-16

我得到一个堆栈溢出错误与以下代码:

void f {
    f();
}
int main() {
   f();
   return 0;
}

知道为什么吗?

问题是函数f调用自己。这会产生一个无限循环,耗尽堆栈并导致程序崩溃。

你期望这个函数应该做什么?

void f {
    f();
}

第一个函数(f)是递归函数。在每次调用f时,将再次调用f函数。这将导致创建新的堆栈帧。现在,没有退出条件,因此f将被反复调用。最终,您将耗尽堆栈帧,并且会发生stackoverflow。

解决这个问题有两种方法。

1。使用尾部递归优化
要做到这一点,如果使用gcc,使用-O2进行编译。因此,使用以下命令:
gcc -O2 $filename -o $executableName这将优化f的尾部递归,本质上是创建一个无限循环,而不是在程序集中创建跳转和链接。请注意,尾递归优化仅在函数中最后做的事情是调用另一个函数时(也就是说,如果您所做的最后一件事导致不再需要堆栈帧)才会起作用。

2。添加退出条件
这取决于你到底想做什么。假设你想递归三次。然后需要在每次调用时向f传递一个参数。然后,在f中,检查退出条件是否为true。如果是的话,就选return。如果没有,则使用一个新参数再次调用f