2012-08-02 73 views
12

在C中,您可以部分初始化结构体或数组,结果是初始化程序中未提及的成员/元素将被初始化。 (C99第6.7.8.19节)。例如: -字符串文字是否计算为部分初始化器并进行零初始化?

int a[4] = {1, 2}; 
// a[0] == 1 
// a[1] == 2 
// a[2] == 0 
// a[3] == 0 

也可初始化“字符类型的数组的”与字符串文字(C99节6.7.8.14),以及“连续的字符...初始化数组的元素”。例如: -

char b[4] = "abc"; 
// b[0] == 'a' 
// b[1] == 'b' 
// b[2] == 'c' 
// b[3] == '\0' 

所有非常简单。但是如果你明确地给出数组的长度会发生什么,但是使用太短的文字来填充数组呢?剩余的字符是否被初始化,还是有未定义的值?

char c[4] = "a"; 
// c[0] == 'a' 
// c[1] == '\0' 
// c[2] == ? 
// c[3] == ? 

把它当作一个部分初始化将使意义,它将使char c[4] = "a"完全一样char c[4] = {'a'},并且它必须让你简明char d[N] = ""零初始化整个字符数组的有用的副作用,但我不清楚这是规格要求。

+2

Woot。我在SO上发现了一个有意义的问题。丹,你做了我的一天。 – 2012-08-02 15:39:52

回答

11
char c[4] = "a"; 

该阵列的所有其余元素将被设置为0。也就是说,不仅c[1]而且还有c[2]c[3]

请注意,这不取决于c的存储时间,即使c具有自动存储持续时间,其余元素将被设置为0

从C标准(重点煤矿):

(C99,6.7.8p21)“如果有在大括号内的列表更少初始化值多于一个聚合的元件或部件,或在用于初始化已知尺寸比有所述阵列中元件的阵列字面字符串更少的字符,所述聚集体的其余部分应为具有静态存储持续时间的对象被初始化隐含相同的。

+0

啊哈,那里。这是我错过的澄清。 – 2012-08-02 15:34:06

5

从C99标准(如已经由ouah说明):

如果在一个大括号内的列表更少初始化值多于字面用于元件或部件的集合体 ,或在一个字符串中更少的字符初始化一个已知大小的数组,比数组中的元素长,其余的聚合应该是 隐式地初始化,就像具有静态存储持续时间的对象一样。

和:

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

  • 如果它有指针类型,它被初始化为空指针;
  • 如果它有算术类型,它被初始化为(正或无符号)零;
  • 如果它是一个聚合,每个成员根据这些规则初始化(递归);
  • 如果它是一个联合,则根据这些 规则初始化(递归)第一个命名成员。

而且char是算术式,所以阵列的其余元件将被初始化到零。

3

绝对无处不在的C语言它遵循全部或全部的方法进行初始化。如果您只是部分初始化一个聚合,则该聚合的其余部分将被初始化为零。

可以这么说,这是过度的,并不是最佳的字符串,但这就是它如何在C中工作。