一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
例如:
#include <stdio.h>
#define SIZE 1 * 1024 * 1024
int main()
{
int b[SIZE];
int i;
for(i = 0; i < SIZE; ++i){
b[i] = i;
}
for(i = 0; i < SIZE; ++i){
printf("%d", b[i]);
}
return 0;
}
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。
#include <stdio.h>
int Sum(const unsigned int n)
{
printf("now n is %u\n", n);
if(0 == n || 1 == n){
return n;
}
return n + Sum(n - 1);
}
int main()
{
unsigned int n;
printf("Input n: ");
scanf("%d", &n);
printf("The sum of 1 to %u is %u\n", n, Sum(n));
return 0;
}
三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
四、没有垃圾回收。