struct mystruct s[10] = {{0}};
这似乎是将结构体数组初始化为0。嵌套大括号的语法是如何工作的?
struct mystruct s[10] = {{0}};
这似乎是将结构体数组初始化为0。嵌套大括号的语法是如何工作的?
任何未指定的字段都会初始化为零。因此,这里有一个结构体数组。您正在使用结构体初始化程序初始化数组的第一个元素,并将结构体的第一个元素初始化为零。第一个结构体的其余部分和数组元素的其余部分也将全部为零。这是一个不错的惯用语。
如下所示?
基本上,您应该将每个复合类型 - 数组、结构等 - 包含在自己的花括号层级中。
请考虑:
struct mystruct
{
int i;
double d;
char s[10];
int a[5];
} s[10] =
{
{ 0, 0.0, "abc", { 1, 2, 3, 4, 5 } },
{ 1, 1.0, "def", { 2, 3 } }, // Partially initialized array
{ 2, 2.0, { 'x', 'y', 'z' }, { 0 } }, // Strings are a shorthand
[9] = { 9, 99, 0, { 9, 8, 7, 6, 5 } }, // C99 - initialize row 9
};
struct mystruct t[3] =
{ // You cannot avoid using these outside braces
0, 0.00, "abc", 1, 2, 3, 4, 5, // Omitted braces
1, 1.11, "bcd", 2, 3, 4, 5, 4,
2, 2.34, // Omitted values
};
任何省略的初始化值都被视为零。
{ 'x','y','z' }
就是一个例子。 - R.. GitHub STOP HELPING ICE不是嵌套的花括号进行初始化。外部花括号表示正在初始化数组:
struct mystruct s[10] = { };
由于这是一个结构数组,因此每个结构都可以使用更多的大括号进行初始化:
struct mystruct { int x, y, z};
struct mystruct s[10] = { {0, 1, 2}, // <-- initializes s[0].x, s[0].y, s[0].z
{1, 2, 3}, // <-- initializes s[1].x, s[1].y, s[1].z
{2, 3, 4} // <-- initializes s[2].x, s[2].y, s[2].z
};
请注意,只有前三个元素被初始化。根据C标准,其余的7个元素必须初始化为0。这也是您代码中发生的情况。正如xscott在他的回复中提到的那样,初始化列表中省略的所有内容都将被初始化为0。
值得注意的是,虽然内部大括号是可选的,但编译器会检查确保开括号只出现在应该出现的位置,并且没有嵌套项有太多的初始化程序。此外,一个可以省略结构体的一些字段,让编译器自动将它们清零,即使这个结构体不在数组的末尾。需要注意的是不同的实现在处理此问题的效率上可能会有所不同;有些实现会将初始化记录分成小块,而另一些则会在代码中插入大量的零。例如,如果每个结构体看起来像:
typedef struct {
char name[8];
char more_stuff[1016];
} THINGIE;
THINGIE my_array[] = {{"Fred"},{"George"},{"Mark"}};
一些编译器会生成3K大小的常量数据,而其他编译器则会生成三个相对较小的“const-init”记录。
int x = {0};
。 - R.. GitHub STOP HELPING ICE
= {{0}}
实际上没有任何影响? - jay.lee