【问题标题】:Unused indices of a global initialized array? [duplicate]全局初始化数组的未使用索引? [复制]
【发布时间】:2017-10-22 16:24:01
【问题描述】:

我有一个结构数组。只有少数索引位置需要初始化。是否有编译器属性确保未初始化的组合初始化为 0?

例如:

如果我有一个静态初始化的结构数组,如下所示,我如何确保该数组中剩余的 3 个元素(未明确预先初始化)为零?

typedef struct foo_s {
    int a;
    int b;
} foo_t;

foo_t foo_array[4] = {
    { .a = 1, .b = 2 },
};

谢谢,

【问题讨论】:

  • 那些未显式初始化的将被“零”初始化。这是 C 语言的一部分。

标签: c arrays c99


【解决方案1】:

您想要的行为已经是标准 C 的一部分。没有“半初始化”变量;如果您只初始化某事物的一部分,那么所有剩余的元素都将被初始化为零。

此外,你说(在你的标题中)这个数组是全局的。这意味着它具有静态存储持续时间,因此即使您根本不提供任何初始化程序,它也会被初始化为零。

在聚合初始化器上引用 C99:

6.7.8/19

[...] 所有未显式初始化的子对象都应隐式初始化,与具有静态存储持续时间的对象相同。

6.7.8/21

如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则剩余的聚合应隐式初始化,与具有静态存储持续时间的对象相同。

6.7.8/10

如果具有静态存储持续时间的对象未显式初始化, 那么:

  • 如果有指针类型,则初始化为空指针;
  • 如果它具有算术类型,则将其初始化为(正或无符号)零;
  • 如果是聚合,则每个成员都根据这些规则进行初始化(递归);
  • 如果是联合,则根据这些规则(递归)初始化第一个命名成员。

【讨论】:

    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多