C struct自动初始化值,数组初始化

时间:2017-03-02 05:56:21

标签: c arrays struct initialization

如果我有两个结构

String arr[] = {"a,b,c", "d,e,f"};
List<String[]> groups = new ArrayList<String>();

for(String s : arr) {
    groups.add(s.split(","));
}

我创建了一个章变量:

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,但我的TA告诉我这将是垃圾?

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

int

是否会使用Chapter chapters[30]; / 0个有价元素填充30个结构?或者用垃圾值元素初始化?

1 个答案:

答案 0 :(得分:7)

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

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

  • 如果它有自动存储持续时间,内容将不确定(是的,“不确定”“垃圾”更合适)。< / p>

引用C11,章节§6.7.9/ p10

  

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

     

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

     

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

     

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

     

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