我们知道一些局部变量的储存是通过栈来实现的。但是我们在实际储存当中,给每个数据存储的空间到底是多少呢?这次以整型数据为例,展示一下如何查看栈的分配。
#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); /*"%d"代表输出十进制数值,"%p"表示输出地址*/
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;
}
我们来看看运算结果:
我们可以看到,在x = 38之后没有37,而是现实核心已转移。这是因为在不断递归的过程中,我们所使用的的存储空间不断扩大,而计算机内部的存储空间有限,不断增加会导致后来的数据覆盖前面的数据,这样程序便无法找到“回去的路”。
再来看看带参数运行的结果:
当参数为20时,便没有显示核心已转移。