代码之家  ›  专栏  ›  技术社区  ›  Damn Vegetables

C是否用0填充多元素数组的剩余部分?

  •  2
  • Damn Vegetables  · 技术社区  · 11 月前

    在韩国政府的一次审查中,(1)是一个正确的说法。

    Choose the wrong statement for the following two-dimensional array in C:
    int mat[3][4]={1,2,3,4,5,6};
    (1) The value of mat[2][2] is 0.
    

    我一直认为C不会用0填充整数数组,所以我试图查找规范,但文档太大了。 This answer (下面的截图用于快速查看,全文在链接中)似乎是在说不完整的初始化隐含为0,但这是由C规范保证的吗?

    enter image description here

    2 回复  |  直到 11 月前
        1
  •  2
  •   Vlad from Moscow    11 月前

    根据C标准(6.7.9初始化):

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

    10如果具有自动存储持续时间的对象未初始化 明确地说,它的值是不确定的。 如果对象具有静态 或者线程存储持续时间未显式初始化,则 :

    如果它具有指针类型,则将其初始化为空指针;

    如果它具有算术类型,则初始化为(正数或 无符号)零;

    如果是聚合,则初始化每个成员(递归) 根据这些规则,并且任何填充都被初始化为零比特;

    如果是并集,则初始化第一个命名成员 (递归地)根据这些规则,并且任何填充都被初始化 至零位;

    所以数组的所有元素 mat 未显式初始化的被0隐式初始化。

    int mat[3][4]={1,2,3,4,5,6};
    

    由于上述声明 mat[2][2] 等于 0 .

    我通过了韩国政府的考试吗?:)

        2
  •  2
  •   chux - Reinstate Monica    11 月前

    初始化不是全部就是全部。不偏袒。对于整数类型,其余为0。