<c语言学习>数组(地址)在编译和运行是经历了什么

在c语言中,创建数组并给予初始化的过程中,数组(地址)在这期间发生了什么?先上代码,顺便理解一下sizeof的问题:

int main()
{
	char arr[20] = "aawwdd";
	printf("%zd", sizeof(arr));
}

        本次用到的得力工具是vs的监视功能,可以看到数组内内存变化情况:

编译阶段

        虽然开始执行后编译已经结束,但我们还是可以通过一些现象来分析出来那块数组(地址)在编译时期发生了什么。

        这里上一张还未执行char arr[20] = "aawwdd"时的监视窗口:

我们可以发现俩个现象:
1.我们可以正常的监视到arr那个地址的内存情况

2.arr在初始化之前就存在一些乱码。

先分析现象1:

        我们能在初始化赋值完成前就可以看到arr的内存情况,说明在此之前已经完成了对内存的申请,(如果没申请就能看,属于越界),而在此之前也就编译这一步了,说明在编译这一步这个连续的20字节空间就被申请了。

现象2:

        在初始化赋值完成前就存在乱码,说明虽然申请了内存,但是里面的内容还是没有进行更改,就行房地产打算建房子需要先买地,在买地这一步搞定后,只是地的使用权搞到手了,这块地原来的东西还是在的(比如杂草什么的)。接下来我们接着run程序,继续看看arr发生了什么。

 执行阶段:

        这里我们走到初始化赋值的前一步:

        我们可以注意到,arr这里的东西像是被清理了一样;

        就像房地产把那块地原来的东西撤走一样,为即将到来的盖房子工作做前戏;

        至于为啥是一堆问号,这个看编译器的心情,打扫方式不一样;

        我们继续下一步:

       

        初始化赋值的这一步走完,我们发现arr里的东西成了我们想要的样子;

        就像房地产商把房子给他建好了;

        我们注意到这块20字节的地盘在放完我们要放的东西后,剩下的都拿来放\0了;

        我们知道\0是字符串的结束标志,我们同样可以用开发商盖房子来比喻,在计划的房子建好后,还剩下很多的空地没用到,那就让他空着,谁叫上级批下来(申请)这么多地。

        \0的ascll码是0,在计算机有不存在的含义,所以用\0填满,也不影响我们前面存的东西。

        当然0代表空,不代表他自己真的不占地方;这里sizeof有话说;

        sizeof(arr)是多少?

        我们可以把sizeof想象成来视察用了多少地盘的领导,领导来到这块地方,他算你用了多少地盘可不会按楼房用掉的面积算的,你买了多少地就是多少地,哪怕这块地你用都没用一下,

        所以,sizeof会实事求是的返回一个20,我只管要了多少,不管你实际用多少。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值