问c++高手什么原因会造成stack overflow?如何解决

如题所述

1、在某个函数中申请的栈空间过大,导致溢出,例如在某个函数中,定义了一个超级大的数组。
2、函数调用的层次太多导致溢出,因为每次调用一次函数,就都会把函数和函数的参数入栈,如果调用函数次数过多,会导致溢出,比如一个递归函数,递归了1000次10000,就可能溢出
3、再就是比较常见的,数组或者指针下标越界,导致的栈溢出。

解决办法的话,可以把一些很大的栈空间需求改成堆空间,然后函数调用层次少点,下标导致的问题的话,得看你自己怎么防备了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-07-09
stack overflow(堆栈溢出)就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了老的堆栈数据。 或者解释为 在长字符串中嵌入一段代码,并将过程的返回地址覆盖为这段代码的地址,这样当过程返回时,程序就转而开始执行这段自编的代码了。
比如如下这段程序:
#include<stdio.h>
int main()
{
char name[8];
printf("Please type your name:");
gets(name);
printf("Hello.%s!",name);
return 0;
}
编译并且执行,输入ipxodiAAAAAAAAAAAAAAAA,执行完gets(name)之后,堆栈如下:
内存底部 内存顶部
name EBP ret
<-------[ipxodiAA][AAAA][AAAA]............
^&name
堆栈顶部 堆栈顶部
由于我们输入的name字符串太长,name数组容纳不下,只好向内存顶部继续写'A'。由于堆栈的生长方向与内存的生长方向相反,这些'A’覆盖了堆栈的老的元素。'EBP ret’都被'A'覆盖了。在main返回的时候,就会把'AAAA'的ASCII码:0x41414141作为返回地址,CPU会试图执行0x41414141处的指令,结果出现错误。这就是一次堆栈溢出!本回答被提问者和网友采纳
相似回答