赋值与初始化:在C中的另一个结构内初始化结构

时间:2018-06-14 01:07:13

标签: c struct

我有一个带有两个字段的结构,这些字段本身就是结构。我想使用初始化列表来分配内部结构的字段,而不必手动分配每个字段。

struct point
{
    int x;
    int y;
};

struct rectangle
{
    struct point p1;
    struct point p2;
};

struct rectangle r2;
r2.p1 = {5, 6};
r2.p2 = {7, 20};

但是这段代码不会编译:

structs3.c:105:11: error: expected expression before ‘{’ token
   r2.p1 = {5, 6};
           ^
structs3.c:106:11: error: expected expression before ‘{’ token
   r2.p2 = {7, 20};
           ^

为什么这不起作用?是什么原因?

4 个答案:

答案 0 :(得分:6)

您可以在定义r2时执行此操作,例如

struct rectangle r2 = {
    {5, 6},
    {7, 20}
};

或使用

中的compound literals
r2.p1 = (struct point){5, 6};
r2.p2 = (struct point){7, 20};

答案 1 :(得分:3)

你所拥有的不是初始化,而是一项任务。初始化必须直接在声明变量的地方完成,在本例中为struct rectangle r2;

您可以通过嵌套{}

在一个步骤中初始化两个嵌套结构
struct rectangle r2 = {
    {5, 6},
    {7, 20},
};

答案 2 :(得分:2)

原因在于C { 5, 6 }本身不是表达式,它本身不能用作表达式中的操作数。 { ... }列表只能在声明或复合文字中用作初始化语法的一部分。

因此,如果您想特别使用赋值,则必须使用复合文字

struct rectangle r2;
r2 = (struct rectangle) { { 5, 6 }, { 7, 20 } };

可选择使用指示符

struct rectangle r2;
r2 = (struct rectangle) { .p1 = { 5, 6 }, .p2 = { 7, 20 } };

或者,单独分配子结构

struct rectangle r2;
r2.p1 = (struct point) { 5, 6 };
r2.p2 = (struct point) { 7, 20 };

同样,如果您愿意,可以将其表达为

struct rectangle r2;
r2.p1 = (struct point) { .x = 5, .y = 6 };
r2.p2 = (struct point) { .x = 7, .y = 20 };

答案 3 :(得分:0)

我想补充一下这个问题。 初始化意味着在首次声明/定义变量时为变量赋予初始值。 C中的初始化列表仅在第一次声明/定义变量时有效。赋值意味着在变量已经声明/定义之后给变量赋值,在代码中较低的位置。

  1.  struct rectangle r2;
  2.  r2.p1 = {5, 6};
  3.  r2.p2 = {7, 20};

struct rectangle对象的初始化在第1行。执行该行之后,现在在内存中创建了struct。在这种情况下,我们无法使用初始化列表,因为这是一个赋值。 我会编写一些程序员老兄的建议。

  1.  struct rectangle r2 = { {5, 6}, {7, 20} };

请注意,它适合一行。这是初始化! 我可以改变上面的代码。请注意,初始化后还可以有任何其他代码行。我想证明这是一项任务。

  1.  struct rectangle r2;
  2.  int x = 1 + 2;
  3.  printf("Hello World\n");
  4.  r2.p1 = {5, 6};
  5.  r2.p2 = {7, 20};
相关问题