runaway 关于查看栈的分配大小问题

博客以整型数据为例,介绍如何查看栈的分配。通过不断递归调用函数查看存储极限,发现不断递归会使存储空间扩大,计算机内部空间有限,会导致数据覆盖,程序无法正常运行。还展示了带参数运行的结果,如参数为20时未显示核心已转移。

我们知道一些局部变量的储存是通过栈来实现的。但是我们在实际储存当中,给每个数据存储的空间到底是多少呢?这次以整型数据为例,展示一下如何查看栈的分配。

#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时,便没有显示核心已转移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值