为什么此数组的所有剩余值都初始化为零?

时间:2013-07-08 13:44:21

标签: c arrays array-initialization

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

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

案例-1

int arr[5];

在这种情况下从arr [0]到arr [4]我们将有垃圾值,但在下一种情况下。

案例-2

int arr[5] = {1};

在这种情况下,arr [0]的值为1,从arr [1]到arr [4]的值将为0。

我的问题是,在case-1中,每个未初始化的阵列位置都有垃圾valeus,那么为什么在-2的情况下,剩余的未启动阵列位置的默认值为0。

4 个答案:

答案 0 :(得分:11)

C11 6.7.9初始化p19 涵盖了这一点(我的重点)

  

初始化应在初始化程序列表顺序中进行,每个初始化程序都为覆盖任何子对象的特定子对象提供   以前列出的同一子对象的初始值设定项; 151)全部   未初始化的子对象应初始化   隐含地与具有静态存储持续时间的对象相同。

部分 6.7.9 p10 表明

  

如果具有静态或线程存储持续时间的对象不是   显式初始化,然后...如果它有算术类型,它是   初始化为(正数或无符号)零;

答案 1 :(得分:9)

C99草案说:

  

如果括号括起的列表中的初始值设定项少于元素或成员   用于初始化已知数组的字符串文字中的聚合或更少字符   大小比数组中的元素大,其余的聚合应该是   隐式初始化与具有静态存储持续时间的对象相同。

静态对象初始化为零。

因此,没有任何初始化程序之间存在很大差异,它会为您提供未初始化的内存内容(您称之为“垃圾”),并且具有初始化程序。如果初始化程序存在但缺少数据,则默认情况下为0。

这非常方便,因为它可以像你一样对初始化大型数组进行初始化。

答案 2 :(得分:4)

您缺少的是,如果只初始化数组的一个元素,其余元素将自动初始化为0.语言以这种方式定义。

答案 3 :(得分:1)

来自C标准的

引用here(点击链接,你可以在那里找到更多有用的信息)

  

如果括号括起的列表中的初始值设定项少于此值   是聚合的元素或成员,或者是一个或多个字符   string literal用于初始化已知大小的数组   是数组中的元素,聚合的其余部分应为   隐式初始化与具有静态存储的对象相同   持续时间。