【问题标题】:Why is this array having all remaining values initialized to zero?为什么这个数组的所有剩余值都初始化为零?
【发布时间】:2013-07-05 21:07:58
【问题描述】:

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

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

案例一

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。

【问题讨论】:

  • 因为标准规定,当您初始化任何数组元素时,所有剩余未显式初始化的元素都会被初始化,就好像它们具有静态存储持续时间一样。这是标准规定的。
  • 出于好奇:您是在全局范围内(即作为静态变量)还是在函数内声明此变量?如果在函数内部,那么您的垃圾值是因为数组是在堆栈上声明的。
  • @PP。我在函数中声明这些数组变量......
  • 即使在任何 C 书籍(数组章节)中,您都可以得到这个“为什么”的答案。

标签: c arrays array-initialization


【解决方案1】:

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

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

6.7.9 p10 节指出

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

【讨论】:

  • even char a[10] = {1};0初始化rest all,arithmetic type的重要性是什么?
  • 请注意,全局变量具有静态存储期限(在这种情况下无需声明它们static)。
  • @GrijeshChauhan 我从 6.7.9.10 中删除了一些与此处无关的要点。这些涉及指针、聚合和联合类型的成员。我也可以删除算术类型的提及,但保留这么小的要点似乎是可以接受的
【解决方案2】:

C99 草案说:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-19
        • 2019-06-18
        • 2011-02-16
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多