在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,我只管要了多少,不管你实际用多少。