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

时间:2017-03-08 23:05:46

标签: 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);

哪条线是正确的?

1 个答案:

答案 0 :(得分:1)

char a[3] = "abc";格式正确;数组的三个元素将是字符'a''b''c'。不会有NUL终止符。 (在分配给数组的存储之后,内存中可能仍会出现零字节,但如果存在,则它不属于数组。printf("%s", a)具有未定义的行为。)

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

  

初始化程序不应尝试为未包含在实体中的对象提供值   被初始化。

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

  

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

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

使用宽字符串文字初始化wchar_t数组时有类似的特殊情况。