在 C99 中空白初始化结构数组
Blank initialising an array of structs in C99
这似乎是我知识上的一个漏洞。据我所知,在 C99 中,如果您初始化 struct
的单个元素而不初始化其他元素,则其他元素初始化为零。下面的代码是否将 struct
的所有成员初始化为零?
typedef struct
{
int foo;
int bar;
char* foos;
double dar;
} some_struct_t;
some_struct_t mystructs[100] = {};
更新:有一些评论表明此语法是一个扩展。如果是这种情况,是否有任何完全符合 C99 标准的方法?
因为是数组初始化,所以需要
some_struct_t mystructs[100] = { 0 }; // ensure all array elements (struct) being zero initialisation
根据C11
,第 6.7.9 章,初始化语法,(为了完整起见,C99
[= 中第 6.7.8 章中提到的相同31=])
initializer:
assignment-expression
{ initializer-list }
{ initializer-list , }
initializer-list:
designationopt initializer
initializer-list , designationopt initializer
designation:
designator-list =
designator-list:
designator
designator-list designator
designator:
[ 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 和其余隐式 zero-initialization(或类似)。
对于structs/unions(和数组)有一条规则说如果它被部分初始化,其余没有被程序员显式初始化的项目被设置为零。
因此,通过键入 some_struct_t mystructs[100] = {0};
,您告诉编译器将 foo
显式设置为零。然后其余的结构成员也隐式设置为零。
这与 C99 无关,但适用于所有 C 标准版本。尽管在 C99/C11 中,指定的初始值设定项 {.foo=0}
会达到完全相同的结果。
这似乎是我知识上的一个漏洞。据我所知,在 C99 中,如果您初始化 struct
的单个元素而不初始化其他元素,则其他元素初始化为零。下面的代码是否将 struct
的所有成员初始化为零?
typedef struct
{
int foo;
int bar;
char* foos;
double dar;
} some_struct_t;
some_struct_t mystructs[100] = {};
更新:有一些评论表明此语法是一个扩展。如果是这种情况,是否有任何完全符合 C99 标准的方法?
因为是数组初始化,所以需要
some_struct_t mystructs[100] = { 0 }; // ensure all array elements (struct) being zero initialisation
根据C11
,第 6.7.9 章,初始化语法,(为了完整起见,C99
[= 中第 6.7.8 章中提到的相同31=])
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 和其余隐式 zero-initialization(或类似)。
对于structs/unions(和数组)有一条规则说如果它被部分初始化,其余没有被程序员显式初始化的项目被设置为零。
因此,通过键入 some_struct_t mystructs[100] = {0};
,您告诉编译器将 foo
显式设置为零。然后其余的结构成员也隐式设置为零。
这与 C99 无关,但适用于所有 C 标准版本。尽管在 C99/C11 中,指定的初始值设定项 {.foo=0}
会达到完全相同的结果。