这似乎是我知识中的一个漏洞。据我所知,在 C99 中,如果您初始化 struct
的单个元素而不初始化其他元素,则其他元素初始化为零。不过,以下代码是否将 struct
的所有成员初始化为零?
typedef struct
{
int foo;
int bar;
char* foos;
double dar;
} some_struct_t;
some_struct_t mystructs[100] = {};
更新:有一些评论表明此语法是一个扩展。如果是这样,是否有任何完全符合 C99 标准的方法?
最佳答案
根据 C11
,第 6.7.9 章,初始化语法,(为了完整起见,在 C99
的第 6.7.8 章中也提到了同样的内容)
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }initializer-list:
designationopt initializer
initializer-list , designationopt initializerdesignation:
designator-list =designator-list:
designator
designator-list designatordesignator:
[ constant-expression ]
. identifier
这意味着,大括号闭合的初始化列表应该至少有一个初始化元素(对象)。
在你的代码中,空的初始化列表
some_struct_t mystructs[100] = {}; //empty list
不是有效的纯 C 语法;它是一个编译器扩展。
您需要在列表中提及单个元素以使其符合标准,例如
some_struct_t mystructs[100] = {0};
符合标准,来自相同标准的第 21 段,
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
因此,在这种情况下,您有一个显式 0 和剩余的隐式零初始化(或类似的)。
关于c - 在 C99 中空白初始化结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41889489/