【问题标题】:Why can't I initialize an array within a nested structure?为什么我不能在嵌套结构中初始化数组?
【发布时间】:2019-04-05 14:27:33
【问题描述】:

我想创建一个由两个相同结构组合而成的新结构。这些子结构中的每一个都包括一个双精度标量和一个三维数组。但是,当我尝试初始化结构时,在尝试为数组赋值时遇到错误。

我没有编译错误,但是当我尝试查看嵌套结构中数组的值时,我看到了非常完全错误的疯狂数字。

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

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

【问题讨论】:

  • 你没有尝试dualquackStruct ducks = {.q1 = duck1, .q2 = duck2};

标签: c nested designated-initializer


【解决方案1】:

您的第一行确实可以编译。但是 - 你不能两次定义同一个变量......

在您的第二行中,您需要在大括号内执行 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} } };

See both lines (after the correction) compiling (GodBoot)。

【讨论】:

  • 必须.q1.q2 之后添加=。如发布的那样,代码不符合 C,它只能编译为 C++。在 Godbolt 的选项中添加 -x c 以强制 C 编译。
  • 您还可以展示更简单的替代方案:dualquackStruct ducks = { { 0.0, { 0.5, 4.0, 2.1} }, { 0.85, {20.0, 10.0, -5.0} } };
  • @jdhabez:注意我的编辑;我忘记了几个= 标志。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多