Vil*_*ray 8 c arrays string initialization c99
假设以下初始化:
char mystr[4] = "";
C99标准是否保证初始化为空字符串的字符数组会将字符数组中的所有元素初始化为空字节?例如,标准是否保证mystr[2] == '\0'?
这些初始化如何:
char myfoo[4] = { '\0' };
char mybar[4] = { 0 };
虽然我敢肯定,明确设置的字符数组的第一个元素将保证元素的其余部分的隐式初始化0,我怀疑在复制到阵列的字符串字面量初始化结果-从而意味着一个单一的 \0复制到阵列,而其余元素保持未初始化.
Tay*_*ter 12
第6.7.8节,第21段:
如果括号括起的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文字中的字符数少于数组中的元素,则聚合的其余部分应为隐式初始化与具有静态存储持续时间的对象相同.
具有静态存储持续时间的对象如何初始化?
第6.7.8节,第10段:
如果未显式初始化具有自动存储持续时间的对象,则其值不确定.如果未显式初始化具有静态存储持续时间的对象,则:
- 如果它有指针类型,则将其初始化为空指针;
- 如果它有算术类型,则初始化为(正或无符号)零;
- 如果是聚合,则根据这些规则初始化(递归)每个成员;
- 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员.
char是一种算术类型,因此它被初始化为0. Huzzah,你可以轻松休息.
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;