我使用以下代码收到了堆栈溢出错误:
void f {
f();
}
int main() {
f();
return 0;
}
知道为什么吗?
答案 0 :(得分:2)
问题是函数f
调用自身。这会产生一个无限循环,耗尽堆栈并使程序崩溃。
你期望这个功能应该做什么?
void f {
f();
}
答案 1 :(得分:1)
第一个函数(f
)是一个递归函数。每次调用f
时,都会再次调用函数f
。这会导致创建新的堆栈帧。现在,没有退出条件,因此f
将被反复调用。最终,您将耗尽堆栈帧,并且将发生堆栈溢出。
有两种方法可以解决这个问题。
<强> 1。使用尾递归优化。
为此,如果使用gcc,请使用-O2进行编译。因此,请使用以下命令
gcc -O2 $filename -o $executableName
这将优化f
尾部递归,并基本上创建一个无限循环,而不是在程序集中创建跳转和链接。
请注意,当您在函数中执行的最后一项操作是调用另一个函数时(即,如果您执行的操作最后导致不再需要堆栈帧),Tail Recursion Optimization only 仍然有效。 / p>
<强> 2。添加退出条件
这取决于你想要做什么。假设您想要递归三次。然后,您需要在每次调用时将参数传递给f
。然后,在f
中,检查退出条件是否为true
。如果是这样,只需return
。如果没有,请再次使用新参数调用f
。