2009-11-01 81 views
5

你能举一个C++堆栈溢出的例子吗?除了递归情况:你能举一个C++堆栈溢出的例子吗?

void foo() { foo(); } 
+11

你要我实现C++整个计算器网站在我的答案?哇... :) – dicroce 2009-11-01 15:57:25

+0

@dicroce:lol +1 :-) – 2009-11-01 15:58:40

+0

为什么不是无限递归一个可以接受的答案? – outis 2009-11-01 16:14:57

回答

14

不涉及无限递归的典型情况是在栈上声明一个太大的自动变量。例如:

int foo() 
{ 
    int array[1000000]; 

} 
6
void function() 
{ 
function(); 
} 
+1

+1干净直爽。这就是你需要吹的堆栈。 – 2009-11-01 16:01:25

+1

我们可以缩短吗?我们可以! ''void _(){_();}'......它几乎就像Perl一样) – Thomas 2009-11-01 16:08:08

+1

区别在于,在Perl领域中,更有可能在Perl执行之前将* stack扩展。 – Rob 2009-11-01 16:09:51

1

此示例显示不受控制的递归。最终,堆栈隔开分配给该过程将通过酒吧和RET的情况下被完全改写......

int foo(int bar) 
{ 
    int ret = foo(42); 
    return ret; 
} 
3

不断尝试,直到堆用完即可回到主?

int main(int argc, char **argv) 
{ 
    return main(argc, argv); 
} 
+3

调用main ()在C++中。 – Tmdean 2009-11-01 16:46:19

+0

我知道它不会正确格式化,但即使对于这个更合适的程序,也没有'-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

+0

我的意思是,当你调用main时,'g ++'不会给出任何警告;你确实是正确的(从我所看到的)标准不允许调用'main'。 – 2009-11-01 17:45:53

0

无限递归:

 
void infiniteFunction() 
{ 
    infiniteFunction(); 
} 

int main() 
{ 
    infiniteFunction(); 
    return 0; 
} 
5

这里有一个在实践中可能会发生:

int factorial(int x) { 
    return x == 0 ? 1 : x * factorial(x-1); 
} 

这溢出堆栈负x。并且,as Frank Krueger mentioned也是太大的x(但是然后int会先溢出)。

3

按编辑:-)

void ping() 
{ 
    pong(); 
} 

void pong() 
{ 
ping(); 
} 

而且,我相信你可以得到堆栈溢出,如果你尝试分配比最大线程堆栈大小(默认情况下VS 1MB)更多的空间,所以像int a[100000];应该提供例外。

+0

call them ping和pong大声笑好的一个 – 2009-11-01 16:01:13

+0

是啊,一个幽默的名字! – 2010-07-21 21:51:29

2

我不敢相信我们忘了所有时间的最大递归示例,阶乘!

#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报告的 “段错误”,而不是 “堆栈溢出”。太糟糕了。

0

如果尝试将大对象放在堆栈上(按值),也可能会发生堆栈溢出。

1

如果你想产生一个明确的非递归程序,导致由功能堆栈溢出电话:

#!/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大于该值;编译和链接程序需要几分钟的时间。

3

编译时例如:

template <int N> 
struct Factorial { 
    enum { value = N * Factorial<N - 1>::value }; 
}; 

// ... 
{ 
    int overflow = Factorial<10>::value; 
}