空白初始化C99中的结构数组

时间:2017-01-27 08:17:32

标签: c struct initialization c99

这似乎是我所知道的漏洞。据我所知,在C99中如果初始化struct的单个元素而没有其他元素,则其他元素初始化为零。下面的代码零是否初始化了struct的所有成员?

typedef struct
{
    int foo;
    int bar;
    char* foos;
    double dar;
} some_struct_t;

some_struct_t mystructs[100] = {};

更新:有一些注释表明此语法是扩展名。如果是这种情况,有没有办法做到纯C99兼容?

3 个答案:

答案 0 :(得分:4)

因为它是数组初始化,所以你需要

some_struct_t mystructs[100] = { 0 }; // ensure all array elements (struct) being zero initialisation

答案 1 :(得分:4)

根据C11,章节§6.7.9,初始化语法,(为了完整性,同样在C99 中的章节6.7.8中提到)< / p>

  

初始化:

     

赋值表达式
  {initializer-list}
  {initializer-list,}

     

初始化列表:
  指定 opt 初始化程序
  initializer-list,指定 opt 初始值设定项

     

指定
  designator-list =

     

指示符列表:
  标志
  指定人名单指定人

     

标志:
  [常量表达]
  。标识符

这意味着,括号闭合的初始化列表应该至少有一个初始化元素(对象)。

在您的代码中,空的初始化列表

 some_struct_t mystructs[100] = {};  //empty list

不是有效的纯C语法;它是一个编译器扩展。

您需要在列表中提及单个元素以使其符合标准,例如

some_struct_t mystructs[100] = {0};
符合标准的

,来自同一标准的第21段,

  

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

因此,在这种情况下,您有一个显式0和剩余的隐式零初始化(或类似)。

答案 2 :(得分:4)

对于结构/联合(和数组),有一条规则说如果它被部分初始化,那么程序员未明确初始化的其余项目将被设置为零。

因此,通过键入some_struct_t mystructs[100] = {0};,您可以告诉编译器将foo显式设置为零。然后其余的struct成员也被隐式设置为零。

这与C99无关,但适用于所有C标准版本。虽然在C99 / C11中,指定的初始值设定项{.foo=0}也可以获得相同的结果。