2017-03-02 157 views
1

如果我有两个结构C结构自动初始化值,数组初始化

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; 

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

此外,如果我声明章节的数组:

Chapter chapters[30]; 

会是填充有30层结构与0/NULL值元素?或用垃圾值元素初始化?

回答

7

这取决于。除非明确初始化,

  • 如果变量具有静态(或线程)的存储时间,成员将被初始化为0或同等学历。

  • 在情况下,它具有自动存储持续时间,内容将被留不确定的(是的,“不确定”“垃圾”更合适)。

引用C11,章§6.7.9/ P10

如果具有自动存储持续时间的对象没有被明确初始化,它的值是 不确定的。如果具有静态或线程存储持续时间的对象未明确初始化为 ,则:

- 如果它具有指针类型,则将其初始化为空指针;

- 如果它有算术类型,它被初始化为(正或无符号)零;

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

- 如果它是联合,第一个命名构件(递归地)根据这些规则初始化,并且任何填充被初始化为零比特;