使用递归的溢出堆栈
Overflowing stack using recursion
使用递归溢出堆栈的方法是什么?我有这样的方法
#include <iostream>
void func()
{
int arr[100500];
func();
}
int main()
{
func();
std :: cin.ignore(); std :: cin.get();
return 0;
}
但我不喜欢它。
由于
无限递归,填充堆栈非常容易;
void func() { func(); }
会做得足够好。任何函数调用都会将信息推送到堆栈(至少是返回地址(,因此如果它在某个时候没有停止调用自己,它将耗尽可用的堆栈。
我发现很难理解为什么您会不喜欢您作为示例展示的此类功能。它做需要做的事情,而且做得很快。
但是,优化可能会导致编译器将函数转换为无限循环,因为很容易发现它不执行任何操作。
如果你想要一个实际做某事的函数的演示,
int factorial(int n) { return n<= 0 ? 1 : factorial(n - 1) * n; }
是一个很好的例子,给定一个适当大的 n 值,并且没有编译器优化(或者它可能会发现尾递归的机会并将其转换为循环(。
如果做不到这一点,试试这个(阿克曼函数,一个递归函数的例子,它不是原始递归的,也不会在最后一行进行优化。
unsigned int A(unsigned int m, unsigned int n)
{
if (m == 0) return n + 1;
if (n == 0) return A(m - 1, 1);
return A(m - 1, A(m, n - 1));
}
读者练习:给定一个智能编译器,可以应用多少优化来最小化递归。
在main()
中,你调用func()
然后调用func()
(本身(,然后调用func()
(本身(等。
每次调用函数时,指针都会被推送到堆栈上。堆栈是有限的内存量,最终会填满,然后你会得到一个stack overflow
。
由于您的程序将无休止地调用func()
堆栈将很快填满。
另请注意,局部变量arr
也将在堆栈上分配。这将更快地填满堆栈。
当递归太深时,可能会导致堆栈溢出,因为函数局部变量和返回地址存储在堆栈上。在您的情况下,您有无限递归,也就是说,您没有条件阻止 func(( 调用自身,因此您将溢出堆栈。
没有定义的限制,这取决于运行递归的语言和体系结构。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 递归克隆图时的堆栈溢出
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 分配大型静态 std::unordered_map 会导致堆栈溢出
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 使用递归的溢出堆栈