【问题标题】:Partial initialization of struct? [duplicate]结构的部分初始化? [复制]
【发布时间】:2016-12-11 19:01:52
【问题描述】:

是否可以静态初始化结构的一部分?

我拥有的结构:

   struct data {
    char name[20];
    float a;
    int b;
    char c;
};

初始化和打印时:

struct data badge = {"badge",307};
printf("%s,%d\n", badge.name, badge.b);

这将打印出“徽章”,但不会打印出“307”。

如何在忽略 float a 的同时使用 char name[20]int b

【问题讨论】:

  • 你怎么能假设 307 会被放在第一位呢?如果您不指定它,编译器怎么能知道呢?您肯定在考虑类型匹配..但请记住 307 很容易被隐式转换为浮点数。
  • 请注意,如果结构的任何部分被初始化,结构将被完全初始化。您没有显式初始化的部分将被隐式初始化为零,就像具有静态存储持续时间的对象一样。

标签: c


【解决方案1】:

您可以按照@sps 的建议使用 C99 的指定初始化程序

struct data badge = {.name = "badge", .b = 307};

但是在 C89 中,没有办法只初始化结构的某些成员。 所以,你必须这样做:

struct data badge = {"badge", 0.0, 307, 0};

请注意,即使使用指定的初始化程序,未显式初始化的成员也会被零初始化。所以,以上两者是等价的。

但是使用指定的初始化器,您没有显式初始化它(想象一下,如果您有 100 个成员的结构 并且您只想为其中 2 个提供首字母 - 就像在您的示例中一样)并使代码更易于阅读。

【讨论】:

  • 这是一个更完整的答案,因为它指出其他成员是零初始化的。
【解决方案2】:

你可以的,

 struct data badge = {.name = "badge", .b = 307};

【讨论】:

    猜你喜欢
    • 2016-09-29
    • 2011-03-11
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多