当 char 数组初始值设定项太长 1 时不发出警告

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。

Vla*_*cow 6

在与 C++ 相反的 C 中,当字符串文字'\\0'的终止零字符未存储在初始化数组中时,您可以使用字符串文字初始化固定大小的字符数组。在这种情况下,数组将不包含字符串。

\n

来自 C 标准(6.7.9 初始化_

\n
\n

14 字符类型数组可以由字符串\n文字或 UTF\xe2\x88\x928 字符串文字初始化,可以选择用大括号括起来。\n字符串文字的连续字节(如果有空间,则包括终止空字符)如果数组大小未知)\n初始化数组的元素

\n
\n

所以在这个声明中

\n
char a[4] = "1234";\n
Run Code Online (Sandbox Code Playgroud)\n

字符数组中没有空间容纳'\\0'字符串文字的终止零字符。

\n

至于这个声明

\n
char b[4] = "12345";\n
Run Code Online (Sandbox Code Playgroud)\n

那么它打破了以下要求

\n
\n

2 初始化程序不得尝试为未包含在正在初始化的实体中的对象提供值。

\n
\n

因为对数组中不包含的字符使用了初始值设定项'5'(不是终止零字符)b

\n

C++ 编译器将为这两个声明发出错误。

\n