【问题标题】:Assignment vs. Initialization: Initializing structs inside another struct in C赋值与初始化:在 C 中初始化另一个结构内的结构
【发布时间】:2018-06-14 01:07:12
【问题描述】:

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

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

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

【问题讨论】:

    标签: c struct


    【解决方案1】:

    你可以在定义r2时这样做,比如

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

    或使用compound literals

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

    【讨论】:

      【解决方案2】:

      您拥有的不是初始化,而是分配。初始化必须直接在声明变量的地方进行,在本例中为struct rectangle r2;

      你可以通过嵌套{}一步来初始化两个嵌套结构:

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

      【讨论】:

        【解决方案3】:

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

        因此,如果您想专门使用 assignment,则必须求助于复合文字

        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】:

          我想补充一下。 初始化是指在第一次声明/定义变量时给变量一个初始值。 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};
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-21
            • 1970-01-01
            • 2014-06-11
            • 2012-07-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多