如果数组的大小至少足以容纳字符串besides中的所有字符(即空终止符),则允许使用字符串初始化char
array.
这一点在C standard页的第6.7.9p14节中有详细说明:
字符类型的数组可以由字符串初始化
文本或utf−8字符串文本,可以 Select 用大括号括起来.
字符串文字的连续字节(包括终止NULL
字符,如果有空间或数组大小未知)
初始化数组的元素.
但是,这也意味着不能将数组视为字符串,因为它不是以null结尾的.如前所述,由于not在b
上执行任何字符串操作,所以代码很好.
你要做的是用一个太长的字符串初始化,即:
char b[2] = "hello";
因为这给出的初始值设定项比数组中可以容纳的初始值设定项多,并且违反了约束.第6.7.9p2节规定如下:
初始化者不得试图为实体中不包含的对象提供值
如果要像这样声明和初始化数组:
char b[] = "hi";
那么b
将是一个大小为3的数组,其大小足以容纳字符串常量中的两个字符加上终止空字节,从而使b
成为字符串.
总结一下:
如果数组具有固定大小:
- 如果用于初始化它的字符串常量比数组短,数组将包含字符串中的字符,连续元素设置为0,因此数组将包含字符串.
- 如果数组足够大,可以包含字符串的元素,但不包含空终止符,那么数组将包含字符串中没有空终止符的字符,这意味着数组不是字符串.
- 如果字符串常量(不包括空终止符)比数组长,这是一个约束冲突,会触发undefined behavior
如果数组没有显式大小,则数组的大小将调整为保持字符串常量加上终止空字节.