为什么输出结果是
-773193728
32758
0
1
-962595264
???
为什么不是
0
0
0
0
0
???
你可以把变量理解成货架(内存地址)和上面的货物(数据),C 语言的变量被声明的时候,储存期可能是自动或者静态的,就好像租赁货架核拥有货架,自动就像按需取用,货架我预约着先但是我可以先不用,真正到我要的时候再用(声明所在的块时),用完了可以让别人用;静态就是我一定要这个货架随时都由我所用,所以程序一启动就要给它准备好了。
标准规定静态储存期的变量初始化时,如果没指定装什么货(隐式初始化),要给它清空货架(空初始化,即全部置零);而动态储存期的变量,除非明确每个架放什么(显式初始化),货架上之前放了东西(内存里本来有值)也无所谓。按标准的说法,初始化成不确定的值。
至于为什么是你看到的这些数字,就看各个编译器各自的行为了,毕竟这是未定义行为(不确定的值当然有不确定的结果),有的编译器好心帮你把货架清了,有的每次都从同一个地方划货架给你用,但是那里本来一般都放固定的东西,有的就随缘了。
另外,隐式初始化是很危险的,因为仓库管理员也不知道货架上本来的货物属于谁的,划给你用了,你要是把东西丢了,或者上面有机密文件给你偷看到了,就很糟糕了。所以不要这么做,就算暂时用不上,每次都写个 = 0
, = {}
,= NULL
吧。
当你运行 int array[15]
的时候,计算机为你找了一个连续15个int长度的内存空间供你使用,但是原先这个空间里面存的是什么那还是什么,因此你读到的array[0]
便是之前使用这块空间的程序,在里面写入的值,如果这块空间没人用过,那么默认的确应该是 0
, 但因为空间开辟存在随机性,所以也可以理解为随机数;
当你函数运行完成, array[15]
这段空间将被释放,也就是允许其他程序使用这片空间,而释放也只是允许别人用,不是说把 15
长度的空间清零,这样别人用的时候,如果不主动修改为 0
, 默认就是你之前写的内容;
计算机的内存是复用的。新分配的内存,如果没有被使用(写入)过,就是0;如果被使用过,内存中的数据就是不确定的、随机的。有些语言在新分配内存时候,编译器会默认进行初始化操作,那么值就是确定的。
这里分配的C数组的内存,不确定是否被使用过,编译器也没有进行初始化,那么值就是不确定的,需要自己显式进行初始化。
人家书上说的是:
你咋直接吃掉
= {初值表}
了。。