c - 初始化结构体数组

标签 c arrays struct initialization

这是我刚刚在别人的问题中发现的初始化。

my_data data[]={
    { .name = "Peter" },
    { .name = "James" },
    { .name = "John" },
    { .name = "Mike" }
};

我以前从未见过这样的东西,也找不到解释 .name 如何可能是正确的。
我正在寻找的是这个过程是如何一步步进行的。

看起来是这样的:

  1. data;
  2. *data;
  3. (*data).name;
  4. (*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/

相关文章:

c - 空闲内存用于 C 中的结构但失败(代码来自 C Primer Plus 第 6 版)

javascript - array.include 是否适用于嵌套对象

Python NumPy 数组

c - char 数组初始值设定项错误中元素过多

c++ - 什么是结构的非成员?

c - 使用 dos.h 在 TSR 编程中使用 keep(int,int) 函数

c - 读取文件到共享内存

swift - 访问结构变量的正确语法是什么?

C代码: for loop compiles with gcc but doesn't run

c++ - 无法在 Eclipse 中解析 C++ 的结构类型