为什么我无法在嵌套的结构体内初始化数组?

3

我想创建一个新的结构体,它是两个相同结构体的组合。每个子结构包括一个标量双精度数和一个三维数组。然而,当我尝试初始化这个结构体时,给数组赋值时出现了错误。

虽然没有编译错误,但当我尝试查看嵌套结构中数组的值时,我发现它们全是错误的、荒谬的数字。

你知道我在这里做错了什么吗?

typedef struct quackStruct {
    double s;
    double v[3];
} quackStruct;

typedef struct dualquackStruct {
    quackStruct q1;
    quackStruct q2;
} dualquackStruct;

int main() {
    quackStruct duck1 = { .s = 0.0, .v = { 0.5,4.0,2.1 } };
    quackStruct duck2 = { .s = 0.85, .v = { 20.0, 10.0, -5.0 } };

    /* I tried this... but it didn't work
    dualquackStruct ducks = { duck1, duck2 }; */

    /* this didn't work either */
    dualquackStruct ducks = { .q1.s = 0.0, .q1.v = { 0.5, 4.0, 2.1 },
                              .q2.s = 0.85, .q2.v = { 20.0, 10.0, -5.0 } };

    printf("%f\n", ducks.q1.s);
    printf("%f\n", ducks.q1.v[0]);
    printf("%f\n", ducks.q1.v[1]);
    printf("%f\n", ducks.q1.v[2]);
    printf("%f\n", ducks.q2.s);
    printf("%f\n", ducks.q2.v[0]);
    printf("%f\n", ducks.q2.v[1]);
    printf("%f\n", ducks.q2.v[2]);

    return 0;
}

2
你没有尝试过 dualquackStruct ducks = {.q1 = duck1, .q2 = duck2}; - Jean-François Fabre
1个回答

4

你的第一行代码是可以编译通过的。但是,你不能重复定义同一个变量...

在第二行代码中,你需要使用大括号进行 q1 和 q2 结构的嵌套初始化,而不是用 .firstlevelfield.secondlevelfield. 这样的语法进入两级下层:

dualquackStruct ducks = { .q1 = { .s = 0.0,  .v = { 0.5,  4.0,  2.1} },
                          .q2 = { .s = 0.85, .v = {20.0, 10.0, -5.0} } };

查看修正后的两行代码编译结果(GodBoot)。


必须.q1.q2后面添加=。按照发布的方式,该代码不符合C标准,只能作为C++编译。在Godbolt的选项中添加-x c以强制进行C编译。 - chqrlie
1
你也可以展示更简单的替代方案:dualquackStruct ducks = { { 0.0, { 0.5, 4.0, 2.1 } }, { 0.85, { 20.0, 10.0, -5.0 } } }; - chqrlie
@jdhabez:请注意我的修改;我忘记了几个“=”符号。 - einpoklum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接