代码之家  ›  专栏  ›  技术社区  ›  Galaxy

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

  •  2
  • Galaxy  · 技术社区  · 6 年前

    我有一个有两个字段的结构,它们本身就是结构。我想使用初始值设定项列表来分配内部结构的字段,而不必手动分配每个字段。

    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 回复  |  直到 6 年前
        1
  •  6
  •   Some programmer dude    6 年前

    你可以在定义 r2

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

    或使用 compound literals

    r2.p1 = (struct point){5, 6};
    r2.p2 = (struct point){7, 20};
    
        2
  •  3
  •   sth Wojciech Parzych    6 年前

    你所拥有的不是初始化,而是分配。在本例中,初始化必须直接在声明变量的位置完成 struct rectangle r2;

    {} :

    struct rectangle r2 = {
        {5, 6},
        {7, 20},
    };
    
        3
  •  2
  •   AnT stands with Russia    6 年前

    原因是在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 };
    
        4
  •  0
  •   Galaxy    6 年前

    我想补充一句话。 初始化意味着在首次声明/定义变量时给变量一个初始值。只有在第一次声明/定义变量时,C中的初始化列表才有效。赋值意味着在变量已经被声明/定义之后,在代码的某个较低的地方给一个变量赋值。

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

    我会写一些程序员建议的代码。

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