c stack overflow - Murray-LIANG/forgetful GitHub Wiki
在函数的递归调用中,函数中变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完。
- 解决递归调用堆栈溢出问题,一种方法是在递归函数中每次动态的分配变量的内存,在使用结束的时候释放内存。以二维数组的动态分配为例:
p=new double*[1000];
for (int m=0;m<1000;m++)
{
p[m]=new double[5000];
}
for(int n=0;n<1000;n++)
{
delete[] p[n];
}
delete[] p;
-
解决递归调用堆栈溢出问题,另外一种方法是在定义递归函数时,输入变量地址,通过指针操作,而非变量本身参加函数的递归调用,不会不断占用堆栈空间不释放。
-
堆栈的大小只有1M,如果在函数中定义了一个占用内存比较大的变量,那么也会导致堆栈溢出。
这种情况只需在定义的时候定义为静态变量就行了,因为静态变量是不占用堆栈内存的。如:
void main() { int a[10010010]; }
在函数内定义的变量默认auto类型,也就是栈变量,运行时使用的是栈空间,函数结束后自动清理返回内存。这里在函数内定义如此大的一个数组,已经超过了单个函数可使用的最大栈空间,也会提示stack overflow。解决办法是将其定义为static int型的静态变量,这样就不占用栈空间了。
void main() { static int a[10010010]; }