C struct自动初始化值,数组初始化
如果我有两个结构
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;
它的两个成员的价值将被初始化为什么? 它是垃圾吗? 还是零? 在我的代码中,我得到0
为int
,但我的TA告诉我这将是垃圾?
另外,如果我要声明一个章节数组:
Chapter chapters[30];
是否会填充30个具有0
/ NULL
值元素的结构? 或者用垃圾值元素初始化?
这取决于。 除非明确初始化,
-
如果变量具有静态(或线程)存储持续时间,则成员将初始化为
0
或等效。 -
如果它具有自动存储持续时间,则内容将保持不确定(是的, “不确定”比“垃圾”更合适)。
引用C11
,章节§6.7.9/ p10
如果未显式初始化具有自动存储持续时间的对象,则其值不确定。 如果未显式初始化具有静态或线程存储持续时间的对象,则:
– 如果它有指针类型,则将其初始化为空指针;
– 如果它有算术类型,则初始化为(正或无符号)零;
– 如果它是一个聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零比特;
– 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零比特;