【问题标题】:C struct automatic initialization values, array initializationsC struct 自动初始化值,数组初始化
【发布时间】:2017-07-21 17:33:58
【问题描述】:

如果我有两个结构

typedef struct {
  int number_of_lines;
  char lines[MAX_CHAPTER_LINES][MAX_STR_SIZE + 1];
} Chapter;

typedef struct {
  char name[MAX_STR_SIZE + 1];
  int number_of_chapters;
  Chapter chapters[MAX_CHAPTERS];
} Book;

我创建了一个章节变量:

Chapter x1;

它的两个成员的值将被初始化为什么?是垃圾吗?还是为零?在我的代码中,int 得到了0,但我的 TA 告诉我这会是垃圾?

另外,如果我要声明一个章节数组:

Chapter chapters[30];

它会被 30 个带有 0/NULL 值元素的结构填充吗?还是用垃圾值元素初始化?

【问题讨论】:

    标签: c arrays struct initialization


    【解决方案1】:

    这取决于。除非显式初始化,否则

    • 如果变量具有静态(或线程)存储持续时间,则成员将被初始化为0 或等效项。

    • 如果它具有自动存储期限,则内容将不确定(是的,"indeterminate""garbage" 更合适)。

    引用C11,第 §6.7.9/p10 章

    如果具有自动存储持续时间的对象未显式初始化,则其值为 不定。如果具有静态或线程存储持续时间的对象未初始化 明确地,那么:

    ——如果是指针类型,则初始化为空指针;

    ——如果是算术类型,则初始化为(正或无符号)零;

    ——如果它是一个聚合,每个成员都根据这些规则被初始化(递归), 并且任何填充都被初始化为零位;

    ——如果是联合,则根据这些规则(递归)初始化第一个命名的成员,并将任何填充初始化为零位;

    【讨论】: