这是我刚刚在别人的问题中发现的初始化。
my_data data[]={
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};
我以前从未见过这样的东西,也找不到解释 .name 如何可能是正确的。
我正在寻找的是这个过程是如何一步步进行的。
看起来是这样的:
-
data;
-
*data;
-
(*data).name;
-
(*data).name="Peter";
还是我完全错了?
最佳答案
my_data
是一个以 name
作为字段的结构,data[]
是结构的数组,您正在初始化每个索引。阅读以下内容:
5.20 Designated Initializers:
In a structure initializer, specify the name of a field to initialize with
.fieldname ='
before the element value. For example, given the following structure,struct point { int x, y; };
the following initialization
struct point p = { .y = yvalue, .x = xvalue };
is equivalent to
struct point p = { xvalue, yvalue };
Another syntax which has the same meaning, obsolete since GCC 2.5, is
fieldname:'
, as shown here:struct point p = { y: yvalue, x: xvalue };
您还可以写:
my_data data[] = {
{ .name = "Peter" },
{ .name = "James" },
{ .name = "John" },
{ .name = "Mike" }
};
如:
my_data data[] = {
[0] = { .name = "Peter" },
[1] = { .name = "James" },
[2] = { .name = "John" },
[3] = { .name = "Mike" }
};
或者:
my_data data[] = {
[0].name = "Peter",
[1].name = "James",
[2].name = "John",
[3].name = "Mike"
};
第二种和第三种形式可能很方便,因为您不需要按顺序编写,例如上面的所有示例都相当于:
my_data data[] = {
[3].name = "Mike",
[1].name = "James",
[0].name = "Peter",
[2].name = "John"
};
如果您的结构中有多个字段(例如,intage
),您可以使用以下命令一次性初始化所有字段:
my_data data[] = {
[3].name = "Mike",
[2].age = 40,
[1].name = "James",
[3].age = 23,
[0].name = "Peter",
[2].name = "John"
};
要了解数组初始化,请阅读 Strange initializer expression?
此外,您可能还喜欢阅读@Shafik Yaghmour switch case 的答案:What is “…” in switch-case in C code
关于c - 初始化结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50992913/