C 语言数组这个代码 ,为啥是这样子 ?

为什么输出结果是
-773193728
32758
0
1
-962595264
???
为什么不是
0
0
0
0
0
???

阅读 3.6k
6 个回答

人家书上说的是:

2) “初值表”中的初值个数,可以少于数组元素的个数

你咋直接吃掉 = {初值表} 了。。

新手上路,请多包涵

int array1[25];
等于
数据类型符 数组名[长度];

没有初始化的数组,其元素的默认值,是随机数。

新手上路,请多包涵

你可以把变量理解成货架(内存地址)和上面的货物(数据),C 语言的变量被声明的时候,储存期可能是自动或者静态的,就好像租赁货架核拥有货架,自动就像按需取用,货架我预约着先但是我可以先不用,真正到我要的时候再用(声明所在的块时),用完了可以让别人用;静态就是我一定要这个货架随时都由我所用,所以程序一启动就要给它准备好了。
标准规定静态储存期的变量初始化时,如果没指定装什么货(隐式初始化),要给它清空货架(空初始化,即全部置零);而动态储存期的变量,除非明确每个架放什么(显式初始化),货架上之前放了东西(内存里本来有值)也无所谓。按标准的说法,初始化成不确定的值。

至于为什么是你看到的这些数字,就看各个编译器各自的行为了,毕竟这是未定义行为(不确定的值当然有不确定的结果),有的编译器好心帮你把货架清了,有的每次都从同一个地方划货架给你用,但是那里本来一般都放固定的东西,有的就随缘了。

另外,隐式初始化是很危险的,因为仓库管理员也不知道货架上本来的货物属于谁的,划给你用了,你要是把东西丢了,或者上面有机密文件给你偷看到了,就很糟糕了。所以不要这么做,就算暂时用不上,每次都写个 = 0, = {}= NULL 吧。

很简单的一个bug,一句话概括总结:
你没有定义初始值,所以计算机默认输出结果为随机值,你定义的0.1.2.3是每个地址,而不是输出的数值。

当你运行 int array[15] 的时候,计算机为你找了一个连续15个int长度的内存空间供你使用,但是原先这个空间里面存的是什么那还是什么,因此你读到的array[0]便是之前使用这块空间的程序,在里面写入的值,如果这块空间没人用过,那么默认的确应该是 0, 但因为空间开辟存在随机性,所以也可以理解为随机数;

当你函数运行完成, array[15] 这段空间将被释放,也就是允许其他程序使用这片空间,而释放也只是允许别人用,不是说把 15 长度的空间清零,这样别人用的时候,如果不主动修改为 0, 默认就是你之前写的内容;

新手上路,请多包涵

计算机的内存是复用的。新分配的内存,如果没有被使用(写入)过,就是0;如果被使用过,内存中的数据就是不确定的、随机的。有些语言在新分配内存时候,编译器会默认进行初始化操作,那么值就是确定的。
这里分配的C数组的内存,不确定是否被使用过,编译器也没有进行初始化,那么值就是不确定的,需要自己显式进行初始化。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进