为每一个程序都有着自己的地址空间,而这些空间各自又被划分为不同的区域。
(潘爱民老师的书中,总共有四类区块)
而在之后,潘老师着重分析了堆栈。
可以看出,堆的可分配面积,远远大于栈。
而栈之所以小,主要的原因,就是它负责的,主要在于函数的调用,以及局部变量的储存。
这引发了我的好奇心,于是就有了今天的这个实验。
/*
11.c
Test the stack
BeginnerC
*/
#include <stdio.h>
int func(int count)
{
int array[65536] = {};
for (int i = 0;i < sizeof(array) / sizeof(array[0]); i++)
{
array[i] = i;
}
printf("%d %d => %u\n", count, 30000, &array[30000]);
if (count < 0)
return 0;
return func(count - 1);
}
int main()
{
func(100);
return 0;
}
可以看到,我在一个小函数里面放了一个很大的数组,为了避免被编译器优化,我让他做了一点无关紧要的工作。
同时,为了确保它可以在栈里面生长,我让他不断递归调用自己。
实验的结果是,在递归了 30 轮以后,程序出现了段错误(实际上就是我们访问的地址,已经超出了允许的范围)
相当于,我们的栈空间,也就差不多7-8mb 的样子,从这个情况上面来看,符合潘老师书中描述的情况,栈的空间,不过数mb 之多。