Bar*_*uch 2 c arrays initialization char string-literals
当我尝试编译以下内容时:
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
}
Run Code Online (Sandbox Code Playgroud)
我收到有关“字符数组的初始化字符串太长”或仅第二行的警告。有谁知道这是否是故意的?为什么第一个不会产生警告?我尝试了 gcc 和 clang。
在与 C++ 相反的 C 中,当字符串文字'\\0'的终止零字符未存储在初始化数组中时,您可以使用字符串文字初始化固定大小的字符数组。在这种情况下,数组将不包含字符串。
来自 C 标准(6.7.9 初始化_
\n\n\n14 字符类型数组可以由字符串\n文字或 UTF\xe2\x88\x928 字符串文字初始化,可以选择用大括号括起来。\n字符串文字的连续字节(如果有空间,则包括终止空字符)如果数组大小未知)\n初始化数组的元素。
\n
所以在这个声明中
\nchar a[4] = "1234";\nRun Code Online (Sandbox Code Playgroud)\n字符数组中没有空间容纳'\\0'字符串文字的终止零字符。
至于这个声明
\nchar b[4] = "12345";\nRun Code Online (Sandbox Code Playgroud)\n那么它打破了以下要求
\n\n\n2 初始化程序不得尝试为未包含在正在初始化的实体中的对象提供值。
\n
因为对数组中不包含的字符使用了初始值设定项'5'(不是终止零字符)b。
C++ 编译器将为这两个声明发出错误。
\n