代码功能
模拟栈溢出的情况。
代脉内容
#include <stdio.h>
#include <stdlib.h>
int recurse(int x) {
int a[1<<15]; /* 4 * 2^15 = 64 KiB */
printf("x = %d. a at %p\n", x, a);
a[0] = (1<<14)-1;
a[a[0]] = x-1;
if (a[a[0]] == 0)
return -1;
return recurse(a[a[0]]) - 1;
}
int main(int argc, char *argv[]) {
int x = 100;
if (argc > 1)
x = atoi(argv[1]);
int v = recurse(x);
printf("x = %d. recurse(x) = %d\n", x, v);
return 0;
}
运行结果
不带参数的运行结果
参数为20时的运行结果
代码分析
int recurse(int x) {
int a[1<<15]; /* 4 * 2^15 = 64 KiB */
printf("x = %d. a at %p\n", x, a);
a[0] = (1<<14)-1;
a[a[0]] = x-1;
if (a[a[0]] == 0)
return -1;
return recurse(a[a[0]]) - 1;
}
调用函数时会生成一个新的栈帧,当函数调用完之后,栈帧被销毁,返回值和返回地址被保留。当定义很大的数组时局部变量会占用空间过大,无法再给栈分配空间,导致栈溢出。递归次数过多或者定义很大的数组会导致栈溢出。