无法解决堆栈溢出错误

时间:2015-08-31 17:05:59

标签: c++ c

我使用以下代码收到了堆栈溢出错误:

void f {
    f();
}

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

知道为什么吗?

2 个答案:

答案 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