一、第一种解释
栈空间是预设的,它通常用于存放临时变量,如果你在函数内部定义一个局部变量,空间超出了设置的栈空间大小,就会溢出。
不仅如此,如果函数嵌套太多,也会发生栈溢出,因为函数没有结束前,函数占用的变量也不被释放,占用了栈空间。
二、第二种解释
对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误,程序就崩溃了。
这个就像木桶里的水,木桶的容量有限,水满了自然会溢出来。那么,栈内存一般有多大呢?
栈内存的大小和编译器有关,编译器会为栈内存指定一个最大值:当然,我们可以通过设置来更改栈内存大小。
那么,什么情况下才会发生栈溢出呢?
1、最常见的就是递归。每次递归就相当于调用一个函数,函数每次被调用时都会将局部数据(在函数内部定义的变量、参数、数组、对象等)放入栈中。
递归1000次,就会将1000份这样的数据放入栈中。这些数据占用的内存直到整个递归结束才会被释放,在递归过程中只会累加,不会释放。
如果递归次数过多,并且局部数据也多,那么会使用大量的栈内存,很容易就导致栈溢出了。
2、在函数内部定义超大数组也会导致栈溢出,例如定义一个 1024 * 1024 的 int 类型的二维数组,就需要 4M 的内存,这在 VS/VC 下就会发生栈溢出。