char four [4] ="四"; 这个陈述的正确语义是什么?

Evi*_*ach 7 c c++ arrays initialization string-literals

int main(void)
{
    char four[4] = "four";
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当编译为C++程序时,G ++报告

xxx.cpp:在函数int main()中:

xxx.cpp:3:错误:字符数组的初始化字符串太长

编译一个C程序时,GCC报告没有错误.

在我看来,正如我所料,赋值正确地将所有4个字节复制到变量中.

所以我的问题归结为......

在C中观察到的行为是正确的还是我在某处接触到未定义的行为,或者它是完全不同的东西?

Car*_*rum 22

简短回答:你的代码是有效的C,但不是有效的C++.

长As:

"four"实际上是5个字符长 - 有一个\0添加给你.在第6.7.8初始化第13段中,C标准说:

字符类型数组可以由字符串文字初始化,可选地用大括号括起来.字符串文字的连续字符(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

因此,\0在编译为C时,程序中只会忽略它.C++对它的处理方式不同.实际上,在C++规范中明确地调用了这种特殊情况(第8.5.2字符数组,第2段):

没有比数组元素更多的初始化器.[ 例如:

char cv[4] = "asdf";  // error
Run Code Online (Sandbox Code Playgroud)

由于隐含的尾随没有空间,因此形成不良’\0’.- 结束例子 ]

  • @Carl:这是完全合法的,但它经常是一个错误,可能导致问题(如`strlen(four)`).标准不是决定什么是完全安全的,只是定义明确的业务.我想看一个警告. (2认同)