此问题已在此处有答案:
How should character arrays be used as strings?(4个答案)
5天前关闭。
当我尝试编译以下代码时:
int main() {
char a[4] = "1234"; // This string is length 5, no warning
char b[4] = "12345"; // This string is length 6, produces a warning
}
我得到了一个关于“char数组的初始化器字符串太长”的警告,或者只在第二行出现这样的警告。有人知道这是不是故意的吗?为什么第一个不发出警告?我尝试了gcc和clang。
1条答案
按热度按时间bvjveswy1#
在C中,与C++相反,当字符串字面量的终止零字符
'\0'
没有存储在初始化的数组中时,可以使用字符串字面量初始化具有固定大小的字符数组。在这种情况下,数组将不包含字符串。从C标准(6.7.9初始化_
14字符类型的数组可以用字符串文字或UTF-8字符串文字初始化,可以用括号括起来。字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素。
所以在这个宣言里
字符数组中没有空间用于字符串文字的终止零字符
'\0'
。至于这个宣言
那么它就打破了
2任何初始化器都不应试图为未包含在被初始化的实体中的对象提供值。
因为使用了初始化器
'5'
(不是终止零字符)用于不包含在数组b
中的字符。C++编译器将对这两个声明发出错误。