全局初始化数组的未使用索引?

时间:2017-10-22 16:24:01

标签: c arrays c99

我有一个struct数组。只需要初始化几个索引位置。是否有编译器属性确保未初始化的组合初始化为0?

例如:

如果我有一个静态初始化结构数组,如下所示,我怎样才能确保该数组中剩余的3个元素(未明确预先初始化)被归零?

typedef struct foo_s {
    int a;
    int b;
} foo_t;

foo_t foo_array[4] = {
    { .a = 1, .b = 2 },
};

谢谢,

1 个答案:

答案 0 :(得分:1)

您想要的行为已经是标准C的一部分。没有“半初始化”变量;如果你只是初始化某些东西,那么所有剩余的元素都将被零初始化。

此外,你说(在你的标题中)这个数组是全局的。这意味着它具有静态存储持续时间,因此即使您根本不提供任何初始化程序,它也将被初始化为零。

在聚合初始值设定项上引用C99:

<强> 6.7.8 / 19

  

[...]未明确初始化的所有子对象应与具有静态存储持续时间的对象隐式初始化。

<强> 6.7.8 / 21

  

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

<强> 6.7.8 / 10

  

如果未明确初始化具有静态存储持续时间的对象,   然后:

     
      
  • 如果它有指针类型,则将其初始化为空指针;
  •   
  • 如果它有算术类型,则初始化为(正数或无符号)零;
  •   
  • 如果是聚合,则根据这些规则初始化(递归)每个成员;
  •   
  • 如果是联合,则根据这些规则初始化(递归)第一个命名成员。
  •