解决堆栈溢出错误时遇到麻烦
Trouble resolving stack overflow error
我得到一个堆栈溢出错误与以下代码:
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
。
相关文章:
- 查找奇数平方和时遇到麻烦
- CSUF EPP - 你有什么想法(在添加到链接列表末尾时遇到麻烦)
- MySQL 从注入过渡到参数化时遇到麻烦
- C++击球平均值程序使用输入/输出文件打印名称,平均值,最高/最低平均值时遇到麻烦
- 以分类方式插入节点时遇到麻烦
- 在此任务上遇到麻烦,我们需要使用指针和数组来找到文本文件中某些数字的平均值,中值和模式
- 我在DFS搜索(树)代码中遇到麻烦.我如何打破递归
- 我在处理字符时遇到麻烦
- 在我的代码覆盖本身时遇到麻烦,我不确定为什么
- C++处理文件,在制作程序时遇到麻烦
- 在客户端/服务器计算器C 方面遇到麻烦
- 从一个字符串中获取 2-5 个连续的单词短语,我得到了 2 个工作,但在做 3 个时遇到麻烦
- boost :: phoenix ::功能遇到麻烦
- 在具有模板成员功能的模板类方面遇到麻烦
- 通过模板参数遇到麻烦
- 快速排序在C++,遇到麻烦
- 计算字符时遇到麻烦
- 在C++中摸索多个排他性组合时遇到麻烦
- 编译phash程序时遇到麻烦
- 在 Linux 上为 OpenGL 4.2 设置开发环境(查找 gl.h 时遇到麻烦)