回答
不涉及无限递归的典型情况是在栈上声明一个太大的自动变量。例如:
int foo()
{
int array[1000000];
}
请参阅Stack overflow - Wikipedia。我已直接链接到示例部分。
此示例显示不受控制的递归。最终,堆栈隔开分配给该过程将通过酒吧和RET的情况下被完全改写......
int foo(int bar)
{
int ret = foo(42);
return ret;
}
不断尝试,直到堆用完即可回到主?
int main(int argc, char **argv)
{
return main(argc, argv);
}
调用main ()在C++中。 – Tmdean 2009-11-01 16:46:19
我知道它不会正确格式化,但即使对于这个更合适的程序,也没有'-Wall'的警告:int main(int argc, char **argv) { if (argc == 0){return 0;} else {std::cout << argc << std::endl; return main(0, argv);} }
–
2009-11-01 17:41:41
我的意思是,当你调用main时,'g ++'不会给出任何警告;你确实是正确的(从我所看到的)标准不允许调用'main'。 – 2009-11-01 17:45:53
无限递归:
void infiniteFunction() { infiniteFunction(); } int main() { infiniteFunction(); return 0; }
这里有一个在实践中可能会发生:
int factorial(int x) {
return x == 0 ? 1 : x * factorial(x-1);
}
这溢出堆栈负x
。并且,as Frank Krueger mentioned也是太大的x
(但是然后int
会先溢出)。
按编辑:-)
void ping()
{
pong();
}
void pong()
{
ping();
}
而且,我相信你可以得到堆栈溢出,如果你尝试分配比最大线程堆栈大小(默认情况下VS 1MB)更多的空间,所以像int a[100000];
应该提供例外。
call them ping和pong大声笑好的一个 – 2009-11-01 16:01:13
是啊,一个幽默的名字! – 2010-07-21 21:51:29
我不敢相信我们忘了所有时间的最大递归示例,阶乘!
#include <stdio.h>
double fact(double n) {
if (n <= 0) return 1;
else return n * fact(n - 1);
}
int main() {
printf("fact(5) = %g\n", fact(5));
printf("fact(10) = %g\n", fact(10));
printf("fact(100) = %g\n", fact(100));
printf("fact(1000) = %g\n", fact(1000));
printf("fact(1000000) = %g\n", fact(1000000));
}
在OS X 10.5.8与GCC 4.0.1:
$ gcc f.c -o f && ./f
fact(5) = 120
fact(10) = 3.6288e+06
fact(100) = 9.33262e+157
fact(1000) = inf
Segmentation fault
不幸的是,OS X报告的 “段错误”,而不是 “堆栈溢出”。太糟糕了。
如果尝试将大对象放在堆栈上(按值),也可能会发生堆栈溢出。
如果你想产生一个明确的非递归程序,导致由功能堆栈溢出电话:
#!/usr/bin/env python
import sys
print "void func" + sys.argv[1] + "() { }"
for i in xrange(int(sys.argv[1])-1, -1, -1):
print "void func" + str(i) + "() { func" + str(i+1) + "(); }"
print "int main() { func0(); return 0; }"
输出示例:
$ python recursion.py 5
void func5() { }
void func4() { func5(); }
void func3() { func4(); }
void func2() { func3(); }
void func1() { func2(); }
void func0() { func1(); }
int main() { func0(); return 0; }
使用范例:
$ python recursion.py 250000 | g++ -x c++ - && ./a.out
至少在我的系统中,调用堆栈s eems为174602,因此您需要将参数设置为recursion.py
大于该值;编译和链接程序需要几分钟的时间。
编译时例如:
template <int N>
struct Factorial {
enum { value = N * Factorial<N - 1>::value };
};
// ...
{
int overflow = Factorial<10>::value;
}
- 1. 堆栈溢出C++
- 2. C#堆栈溢出
- 3. C++堆栈溢出
- 4. 堆栈溢出
- 5. 堆栈溢出的示例代码
- 6. 你能举一个会话固定攻击的例子吗?
- 7. .NET堆栈溢出?
- 8. Threading.Timer堆栈溢出
- 9. Lua堆栈溢出
- 10. MPMoviePlayerController堆栈溢出
- 11. Malloc堆栈溢出
- 12. VS可能会警告可能的堆栈溢出异常吗?
- 13. 堆栈搜索导致堆栈溢出
- 14. XmlReader中的堆栈溢出C#
- 15. 带循环c的堆栈溢出#
- 16. 堆栈溢出的C变量位置
- 17. 保存堆栈溢出帖子
- 18. 堆栈溢出中的SAML?
- 19. Jboss中的堆栈溢出
- 20. freertos中的堆栈溢出
- 21. 堆栈溢出的serialport上
- 22. MemoryError:python中的堆栈溢出
- 23. Prolog中的堆栈溢出
- 24. C#WPF Window.ShowDialog堆栈溢出异常
- 25. 堆栈溢出问题,用C
- 26. C#堆栈溢出覆盖EIP
- 27. C++ smart_ptr不会导致堆栈溢出?
- 28. 调试C# - 堆栈溢出异常?
- 29. 序言集,堆栈溢出
- 30. 堆栈溢出(Shellcoder手册)
你要我实现C++整个计算器网站在我的答案?哇... :) – dicroce 2009-11-01 15:57:25
@dicroce:lol +1 :-) – 2009-11-01 15:58:40
为什么不是无限递归一个可以接受的答案? – outis 2009-11-01 16:14:57