3

我有一个结构代码,如下所示:

typedef struct A {
  B numberOfB[3];
} A;

typedef struct B {
  int number1;
  int number2;
  boolean bool1;
  boolean bool2;
} B;

在源代码中,我有一个如下所示的初始化:

A* pointerToA = (A[3]) {

  {5, 1, TRUE, TRUE,
   6, 1, TRUE, FALSE,
   7, 1, TRUE, FALSE},

  {5, 1, TRUE, TRUE,
   6, 1, TRUE, FALSE,
   7, 1, TRUE, FALSE},

  {5, 1, TRUE, TRUE,
   6, 1, TRUE, FALSE,
   7, 1, TRUE, FALSE},
}

源代码中的这种构造正在更新字段,struct B但我不明白如何更新字段,B因为值只是列出,因为它是 12 个值的数组。有人可以详细解释一下吗?

4

2 回答 2

5

在初始化器中反映子结构是可选的。所以这里有 12 个值足以初始化一个A.

不过,我认为这是一种非常糟糕的风格,因为它使代码很难阅读。甚至更好的是使用指定的初始化器,这样初始化相对于结构的变化变得健壮。就像是

[0] = {.number1 = 5, .number2 = 1, .bool1 = true, .bool2 = true, },

另请注意,C 具有正确的布尔类型和常量,您最好通过标头<stdbool.h>将其用作bool,falsetrue

于 2017-11-27T15:09:54.323 回答
0

复合文字实际上是从 C99 引入的:

一个复合文字,它看起来像是在执行包含初始化程序的强制转换。它的值是强制转换中指定类型的对象,包含初始化器中指定的元素;它是一个左值。

在 C 中,复合文字指定具有静态或自动存储持续时间的未命名对象。

简单复合文字的语义。下面只是使用复合文字的示例结构初始化。

 struct sample {int a; int b;} struct_obj;

这就是为 struct_obj 构造复合文字的方式。

 struct_obj = ((struct sample) {1, 2});

这相当于

 {
   struct foo temp = {1, 2};
   structure = temp;
 }

在您的情况下, struct A 使用数组值初始化。

A* pointerToA = (A[3]) {..... } // here A[3] is initialized with the values in your array.
于 2017-11-27T15:19:35.040 回答