在外部结构初始化中反映内部结构

Reflecting inner struct in outer struct initialization

我有一个结构代码如下:

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 个值的数组。有人可以详细解释一下吗?

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

虽然我认为这确实是一种糟糕的风格,因为它使代码很难阅读。甚至更好的方法是使用指定的初始值设定项,这样初始化相对于结构的变化变得健壮。像

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

还要注意 C 有一个正确的布尔类型和常量,您最好通过 header <stdbool.h> 将其用作 boolfalsetrue .

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

在你的例子中,结构 A 是用数组值初始化的。

A* pointerToA = (A[3]) {..... } // here A[3] is initialized with the values in your array.