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

你好我是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中,每个未初始化的arrays位置都有垃圾valeus,那么为什么在2-case剩余的未初始化arrays位置具有0作为默认值。

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

初始化应在初始化程序列表顺序中进行,每个初始化程序为特定子对象提供,覆盖同一子对象的任何先前列出的初始化程序; 151) 未明确初始化的所有子对象应与具有静态存储持续时间的对象隐式初始化

6.7.9节第10条规定

如果没有显式初始化具有静态或线程存储持续时间的对象,则……如果它具有算术类型,则将其初始化为(正或无符号)零;

C99草案说:

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

静态对象初始化为零。

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

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

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

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

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