c-为什么这个数组的所有剩余值都初始化为零



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

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

案例1

int arr[5];

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

情况-2

int arr[5] = {1};

在这种情况下,arr[0]将具有值1,并且从arr[1]到arr[4]的剩余部分将具有值0。

我的问题是,当在案例1中,每个未初始化的数组位置都有垃圾值时,为什么在案例2中,剩余的未初始化数组位置的默认值为0。

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

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

6.7.9第10页节规定

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

C99草案说:

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

并且静态对象被初始化为零。

因此,完全没有初始化器(这会给你未初始化的内存内容(你称之为"垃圾")和有初始化器之间有很大的区别。如果初始值设定项存在,但缺少数据,则默认情况下会得到0。

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

缺少的一点是,如果只初始化数组的一个元素,那么它的其余元素将自动初始化为0。语言就是这样定义的。

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

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

相关内容

  • 没有找到相关文章