【问题标题】:Partial initialization for an array of structures in CC中结构数组的部分初始化
【发布时间】:2021-08-02 23:33:51
【问题描述】:

在复习我的 C 知识时,我偶然发现了以下示例:

#include <stdio.h>

/* Just a simple structure */
typedef struct lab {
    int num;
    char *str;
} bal;

int main (void) {
    /* Declare and _partially_ initialize an array of the structure above... */
    bal struct_array[10] = { {0, NULL} };

    /* Question: what does _exacly_ happen to the other 9 members of the array? */ 
    return 0;
};

代码中的注释应该足以提供我的问题。换句话说,如果我们部分初始化一个结构数组会发生什么?当然,我知道(至少)对于 C++11 有默认初始化。但它也适用于纯 C 吗?如果是,是所有标准(从 C89 开始)都是如此,还是仅适用于某些标准?谢谢。

【问题讨论】:

  • 我认为你甚至可以通过bal struct_array[10] = {{0}};获得相同的结果
  • 是的,既然我们知道要保留的默认初始化,我当然同意 '={{0}}';和其他提议的变体。
  • @mediocrevegetable1 = {0}; 也可以用作“通用初始化器”。

标签: c struct initialization


【解决方案1】:

如果数组或结构仅部分初始化,则任何没有显式初始化器的包含对象都将设置为 0 或 NULL。

C11 standard 的第 6.7.9p21 节介绍了部分初始化:

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

6.7.9p10 节介绍了具有静态存储持续时间的对象的初始化:

如果具有自动存储持续时间的对象不是 显式初始化,其值是不确定的。如果 具有静态或线程存储持续时间的对象不是 显式初始化,然后:

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

因此,在您的特定情况下,所有数组元素都将 num 成员设置为 0,str 成员设置为 NULL。

【讨论】:

  • 非常有趣,感谢您的参考。它也适用于 C89 和 C99 吗?
  • @user47 是的,C89 和 C99 中有类似的语言。
猜你喜欢
  • 2016-09-29
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多