内存中的字符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);
哪条线是正确的?
答案 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
数组时有类似的特殊情况。