C 即使绑定不正确,字符串文本后是否添加了空字符?

C 即使绑定不正确,字符串文本后是否添加了空字符?,c,string,C,String,内存中字符c之后是否有空字符: char a[3]="abc"; printf("the value of the character is %.3s\n",a); printf("the value of the character is %s\n",a); 哪一行是正确的?代码>字符a[3]=“abc”格式正确;数组的三个元素是字符'a','b'和'c'。不会有NUL终结者。(在分配给阵列的存储之后,内存中可能仍然有一个零字节,但如果有,它就不是阵列的一部分。printf(“%s”,a)具

内存中字符c之后是否有空字符:

char a[3]="abc";
printf("the value of the character is %.3s\n",a);
printf("the value of the character is %s\n",a);
哪一行是正确的?

代码>字符a[3]=“abc”格式正确;数组的三个元素是字符
'a'
'b'
'c'
。不会有NUL终结者。(在分配给阵列的存储之后,内存中可能仍然有一个零字节,但如果有,它就不是阵列的一部分。
printf(“%s”,a)
具有未定义的行为。)

您可能认为这违反了初始化器对于对象C99 6.7.8p2太长时的正常规则

初始化者不得试图为实体中不包含的对象提供值 正在初始化

这是“约束”部分中的“应”语句,因此违反它的程序是格式错误的。但是,当您使用字符串文字初始化
char
数组时,有一种特殊情况:C99 6.7.8p14读取

字符类型的数组可以由字符串文字(可选)初始化 用大括号围起来的。字符串文字的连续字符(包括 如果有空间或数组大小未知,则终止空字符)初始化 数组的元素

括号覆盖6.7.8p2,并指定在这种情况下,终止的空字符被丢弃


对于使用宽字符串文字初始化
wchar\u t
数组,也有类似的特殊情况。

No在
a
数组中没有NUL,如图所示。我确信这是一个dup,我正在寻找它(我可能自己也回答了)。不,没有。所以编译器只在长度足够的情况下添加空字符,对吗?@yellowantphil抱歉,刚刚进行了复制粘贴,忘记了删除精度。可能是