初始化结构数组

时间:2013-09-20 16:28:40

标签: 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";

或者我完全错了?

6 个答案:

答案 0 :(得分:20)

my_data是一个结构,name作为字段,而data[]是结构的结构,您正在初始化每个索引。阅读以下内容:

  

5.20 Designated Initializers

     

在结构初始值设定项中,指定要在元素值之前使用.fieldname ='初始化的字段的名称。例如,给定以下结构,

 struct point { int x, y; };
     

以下初始化

 struct point p = { .y = yvalue, .x = xvalue };
     

相当于

 struct point p = { xvalue, yvalue };
     

具有相同含义的另一种语法,自GCC 2.5以来已过时,为fieldname:',如下所示:

 struct point p = { y: yvalue, x: xvalue };

你也可以写:

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

as:

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" }
}; 

要理解数组初始化,请阅读Strange initializer expression?
此外,您还可以阅读@ Shafik Yaghmour的切换案例答案:What is “…” in switch-case in C code

答案 1 :(得分:19)

这里只有两种语法可供使用。

  1. 普通旧数组初始化:

    int x[] = {0, 0}; // x[0] = 0, x[1] = 0
    
  2. 指定的初始化程序。请参阅此问题的已接受答案:How to initialize a struct in accordance with C programming language standards

    虽然语法很明显。您可以这样初始化:

    struct X {
        int a;
        int b;
    }
    struct X foo = { 0, 1 }; // a = 0, b = 1
    

    或使用任何订购,

    struct X foo = { .b = 0, .a = 1 }; // a = 1, b = 0
    

答案 2 :(得分:13)

没有"一步一步"这里。当使用常量表达式执行初始化时,该过程基本上在编译时执行。当然,如果数组被声明为本地对象,它将在本地分配并在运行时进行初始化,但仍然可以将其视为无法进行有意义细分的单步过程。

指定的初始值设定项允许您为struct对象的特定成员(或数组的特定元素)提供初始值设定项。所有其他成员都被零初始化。因此,如果my_data被声明为

typedef struct my_data {
  int a;
  const char *name;
  double x;
} my_data;

然后你的

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

只是一种更紧凑的

形式
my_data data[4]={
    { 0, "Peter", 0 },
    { 0, "James", 0 },
    { 0, "John", 0 },
    { 0, "Mike", 0 }
};

我希望你知道后者的作用。

答案 3 :(得分:2)

它被称为指定初始化程序,它是在C99中引入的。它用于初始化struct或数组,在此示例中为struct

鉴于

struct point { 
    int x, y;
};

以下初始化

struct point p = { .y = 2, .x = 1 };

相当于C89风格的

struct point p = { 1, 2 };

答案 4 :(得分:1)

这很简单: my_data是之前定义的结构类型。 所以你要声明一个my_data - 一些元素的数组,就像你使用

一样
char a[] = { 'a', 'b', 'c', 'd' };

因此,数组将包含4个元素,并将它们初始化为

a[0] = 'a', a[1] = 'b', a[1] = 'c', a[1] ='d';

这被称为指定的初始化程序(我记得正确)。

它只是表明数据必须是my_dat类型,并且必须是一个需要存储这么多my_data结构的数组,其中有一个结构,每个类型的成员名称为Peter,James,John和Mike

答案 5 :(得分:0)

这是指定的初始化程序,随C99标准一起引入;它允许您按名称初始化结构或联合对象的特定成员。 my_data显然是struct类型的typedef,其成员name的类型为char *char [N]