你可以给C ++的堆栈溢出的例子吗?(Can you give an example of stac

2019-09-03 12:04发布

你可以给C ++的堆栈溢出的例子吗? 除了递归情况下:

void foo() { foo(); }

Answer 1:

不涉及无限递归的典型情况下被声明堆栈太大上的自动变量。 例如:

int foo()
{
    int array[1000000];

}


Answer 2:

请参阅堆栈溢出-维基百科 。 我已经直接链接到示例部分。



Answer 3:

void function()
{
 function();
}


Answer 4:

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

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

这种溢出堆栈负x 。 而且, 弗兰克克鲁格提到的 ,也过大x (但随后int会溢出第一)。



Answer 5:

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

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


Answer 6:

按编辑:-)

void ping()
{
  pong();
}

void pong()
{
ping();
}

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



Answer 7:

编译时例如:

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

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


Answer 8:

我不能相信我们离开的有史以来最伟大的递归例如,阶乘!

#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报告中“segmentation fault”,而不是“堆栈溢出”。 太糟糕了。



Answer 9:

这个例子显示了不受控制的递归。 最终,间隔分配给此进程的堆栈将完全由巴和RET的情况下改写......

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


Answer 10:

如果要生成一个明确的非递归程序,导致通过函数调用堆栈溢出:

#!/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

至少在我的系统上,调用堆栈似乎是174602,所以你需要设置参数recursion.py得比较大; 它需要几分钟的时间来编译和链接程序。



Answer 11:

无限递归:

void infiniteFunction()
{
    infiniteFunction();
}

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


Answer 12:

如果你试图把大对象堆(按值)。您还可以得到一个堆栈溢出。



文章来源: Can you give an example of stack overflow in C++?