假设以下初始化:
char mystr[4] = "";
C99标准是否保证初始化为空字符串的字符数组会将字符数组中的所有元素初始化为空字节?例如,标准是否保证mystr[2] == '\0'
?
这些初始化如何:
char myfoo[4] = { '\0' };
char mybar[4] = { 0 };
虽然我很确定明确设置字符数组的第一个元素将保证将其余元素隐式初始化为0
,但我怀疑字符串文字初始化会导致数组复制到数组 - 因此意味着将单个 \0
复制到数组中,而其余元素保持未初始化状态。
答案 0 :(得分:12)
第6.7.8节,第21段:
如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。
具有静态存储持续时间的对象如何初始化?
第6.7.8节,第10段:
如果没有显式初始化具有自动存储持续时间的对象,则其值是不确定的。如果没有显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正数或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些初始化(递归)第一个命名成员 规则。
char是算术类型,因此它被初始化为0. Huzzah,你可以轻松休息。
答案 1 :(得分:6)
C语言遵循所有聚合初始化的“全有或全无”方法。这意味着任何为聚合的任何部分提供显式初始化程序的尝试(无论该部分有多小)都会立即保证整个聚合将被初始化。没有显式初始化程序的部分将被零初始化。
在您的示例中,保证使用零初始化整个数组。在结构初始化的情况下,未显式初始化的所有字段都将获得零值。
该原则的一个结果是,在C语言中,= { 0 }
初始化程序用作惯用的通用零初始化程序。由于该语言在标量对象初始化器中也允许使用= { value }
语法,因此可以使用= { 0 }
将任何对象初始化为全零状态
#define UNIVERSAL_ZERO { 0 }
double d = UNIVERSAL_ZERO;
char s[100] = UNIVERSAL_ZERO;
struct { int x, y, z; } xyz = UNIVERSAL_ZERO;
int *p = UNIVERSAL_ZERO;
答案 2 :(得分:4)
是的,数组的多余元素始终为零初始化,使用字符串文字初始化的char
数组也不例外。
根据C99标准,第6.7.8.21节(this document的第139页):
21如果括号括起的列表中的初始值设定项少于元素或成员 用于初始化已知数组的字符串文字中的聚合或更少字符 大小比数组中的元素大,其余的聚合应该是 隐式初始化与具有静态存储持续时间的对象相同。