这似乎是我所知道的漏洞。据我所知,在C99中如果初始化struct
的单个元素而没有其他元素,则其他元素初始化为零。下面的代码零是否初始化了struct
的所有成员?
typedef struct
{
int foo;
int bar;
char* foos;
double dar;
} some_struct_t;
some_struct_t mystructs[100] = {};
更新:有一些注释表明此语法是扩展名。如果是这种情况,有没有办法做到纯C99兼容?
答案 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}
也可以获得相同的结果。