2

看下面的代码:

#include<stdio.h>

int main(void)
{
    char name[7]={'E','R','I','C'};
    printf("%s",name);
}

它输出整个name ERIC。为什么会这样?只有当我们如下%s初始化字符数组时才应该起作用:name

    char name[7]={'E','R','I','C','\0'};   //With NULL terminator

我没有考虑以下内容,因为这显然假设了一个以空字符结尾的字符数组:

   char name[7]="ERIC"
4

2 回答 2

5

根据c11规范

(6.7.9.21) 如果大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文字中的字符少于数组中的元素,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同。

(6.7.9.10) 如果具有静态或线程存储持续时间的对象未显式初始化,则:

— 如果它具有算术类型,则将其初始化为(正或无符号)零;

因此,当您像这样初始化一个数组时:

char name[7]={'E','R','I','C'};

它与以下内容相同:

char name[7]={'E','R','I','C', 0, 0, 0};

所以name仍然是空终止的。

于 2013-05-05T08:10:27.933 回答
2

来自 C99 第 7.21.6.1 节第 8 段%s说明符

如果不存在 l 长度修饰符,则参数应是指向字符类型数组的初始元素的指针。数组中的字符被写入(但不包括)终止的空字符。如果指定了精度,则写入的字节数不会超过这个数。如果未指定精度或大于数组的大小,则数组应包含空字符。

因此,如果您有一个指向要char *打印的 a 的指针,则使用printf它将打印,直到\0找不到 a。

char name[7]={'E','R','I','C'};在这种情况下被`\0'终止,因为数组的长度为 7,但只有 4 个位置被初始化,这将导致其他剩余位置被初始化为 0。查看 johnchen902 的答案以获取更多信息。

于 2013-05-05T08:11:49.477 回答