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段):
没有比数组元素更多的初始化器.[ 例如:
Run Code Online (Sandbox Code Playgroud)char cv[4] = "asdf"; // error
由于隐含的尾随没有空间,因此形成不良
’\0’
.- 结束例子 ]