为什么有初始化为零所有剩余值这个数组?为什么有初始化为零所有剩余值这个数组?(Why is this

2019-05-12 09:42发布

你好,我是在C语言编程初学者,最近我开始学习阵列 ,我研究过,默认情况下在一个int数组中所有的值都是垃圾

那为什么我在这两种情况下获得不同的值。

情况1

int arr[5];

在这种情况下,将arr [0]直到ARR [4],我们将有垃圾的价值观,但在接下来的情况。

案例2

int arr[5] = {1};

在这种情况下ARR [0]将具有值1并从ARR [1]给Arr剩余[4]将具有值0。

我的问题是,当万一-1每个未initilized阵列位置被具有垃圾valeus那么为什么在情形2中剩余的未initilized阵列位置被具有0作为默认值。

Answer 1:

C11 6.7.9初始化P19包括这(我的重点)

初始化应发生在初始化列表顺序,提供了一种用于特定子对象重写为同一子对象任何前面列出的初始化每个初始化; 151), 其没有明确地初始化全部子对象将被隐式初始化一样具有静态存储持续时间的对象

6.7.9 P10规定,

如果具有静态或线程存储持续时间的对象没有明确地初始化,然后...如果它具有算术类型,它被初始化为(正或无符号的)零;



Answer 2:

该C99草案说:

如果在一个大括号内的列表更少初始化比有元件或部件的集合体,或更少的字符在字面使用除了有数组中的元素,所述聚集体的其余部分应初始化已知大小的阵列的串被隐式初始化一样具有静态存储持续时间的对象。

和静态对象的初始化为零。

那么,有没有任何初始化可言,这给你的内存未初始化的内容(你所说的“垃圾”),并具有初始化之间的较大差异。 如果初始值是存在的,但缺少的数据,在默认情况下得到0。

这是非常方便的,因为它能够做,就像你做0初始化一个大阵。



Answer 3:

你缺少的一点是,如果你初始化数组的一个元素,它的元素的其余部分将被自动初始化为0的语言以这种方式定义。



Answer 4:

从所引用的C标准在这里 (打的链接,你可以找到一些有用的信息有)

如果在一个大括号内的列表更少初始化比有元件或部件的集合体,或更少的字符在字面使用除了有数组中的元素,所述聚集体的其余部分应初始化已知大小的阵列的串被隐式初始化一样具有静态存储持续时间的对象。



文章来源: Why is this array having all remaining values initialized to zero?