如果输入到字符数组中的字符数少于您指定的空间数量,会发生什么?

4
char ch_arry[20] = { S, A, L, L, Y};
printf( "%s", ch_arry[] );

它会用空字符填充数组的末尾吗?

1
最后15个字符的内容未定义。 - David
4
没错,@David。C语言没有部分初始化。 - John Bollinger
1
请注意,除非您拥有将映射到适用于初始化字符的整数常量的宏S、A、L和Y,否则您需要使用'S'、'A'、'L'、'L'、'Y'。 - Jonathan Leffler
@JonathanLeffler - 或者变量具有相同的名称 - KevinDTimm
@JonathanLeffler:对项目经理说“我正在构建EBCDIC支持”就好了。 - Bathsheba
1
@KevinDTimm:这取决于变量的定义位置。在函数内部,是的。在文件范围内——不是。 - Jonathan Leffler
3个回答

6

根据C标准(6.7.9 Initialization):

19 初始化必须按照初始化器列表的顺序进行,为特定子对象提供的每个初始化器都会覆盖同一子对象先前列出的初始化器;所有未显式初始化的子对象将被隐式初始化,其方式与具有静态存储期的对象相同。

并且

10 如果具有自动存储期的对象未经显式初始化,则其值是不确定的。如果没有明确初始化具有静态或线程存储期的对象,则:

— 如果它具有指针类型,则初始化为null指针;

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

— 如果它是一个聚合体,则根据这些规则递归地初始化每个成员,并将任何填充初始化为零位。

因此,如果您有以下声明:

char ch_arry[20] = { 'S', 'A', 'L', 'L', 'Y'};

那么,数组中所有未显式初始化的元素将会隐式地被初始化为 0。


点赞 - 我喜欢你的高质量参考答案。你的标准副本显然被翻阅得很多。 - Bathsheba
@Bathsheba 谢谢您。:) - Vlad from Moscow
3
还要注意§6.7.9 21--"如果括号内列表中的初始值少于一个聚合体中的元素或成员,或者用于初始化已知大小数组的字符串字面值中的字符数少于数组中的元素数,则聚合体的其余部分应隐式地与具有静态存储期的对象相同进行初始化。" - ad absurdum

4
剩余的15个字符都被设置为\0。这是C语言的一个有用特性。
请注意,您需要使用

标签。
char ch_arry[20] = { 'S', 'A', 'L', 'L', 'Y'};

除非你有一些疯狂的宏魔法,否则
printf("%s", ch_arry);

0

你自己回答了问题。

剩下的15个字符将被赋予空值。

而且你声明数组的方式是错误的...如果你想让ch_array = SALLY,你应该在每个字符上使用单引号('S'这样)。

输出时使用printf("%s", ch_arry);而不是printf("%s", ch_arry[]);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接