【Unix 系统编程】局部函数调用的简单堆栈实验

45 阅读1分钟

为每一个程序都有着自己的地址空间,而这些空间各自又被划分为不同的区域。

在这里插入图片描述

(潘爱民老师的书中,总共有四类区块)

而在之后,潘老师着重分析了堆栈。

在这里插入图片描述

可以看出,堆的可分配面积,远远大于栈。
而栈之所以小,主要的原因,就是它负责的,主要在于函数的调用,以及局部变量的储存。

这引发了我的好奇心,于是就有了今天的这个实验。

在这里插入图片描述

/*
    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;
}

可以看到,我在一个小函数里面放了一个很大的数组,为了避免被编译器优化,我让他做了一点无关紧要的工作。
同时,为了确保它可以在栈里面生长,我让他不断递归调用自己。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oCjcc0iS-1683189698372)(https://foruda.gitee.com/images/1682406013606768567/4dc23875_871414.png "屏幕截图")]

实验的结果是,在递归了 30 轮以后,程序出现了段错误(实际上就是我们访问的地址,已经超出了允许的范围)
相当于,我们的栈空间,也就差不多7-8mb 的样子,从这个情况上面来看,符合潘老师书中描述的情况,栈的空间,不过数mb 之多。