4

您好我是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 中每个未初始化的数组位置都有垃圾值时,为什么在 case-2 中剩余的未初始化数组位置的默认值是 0。

4

4 回答 4

11

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

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

6.7.9 p10节指出

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

于 2013-07-08T13:47:50.380 回答
9

C99 草案说:

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

静态对象初始化为零。

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

这非常方便,因为它可以通过像您所做的那样对大型数组进行 0 初始化。

于 2013-07-08T13:47:00.977 回答
4

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

于 2013-07-08T13:46:05.357 回答
1

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

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

于 2013-07-08T13:50:45.990 回答