char四[4] =“四”;该语句的正确语义是什么?
-
29-09-2019 - |
题
int main(void)
{
char four[4] = "four";
return 0;
}
当编译为C ++程序时,G ++报告
xxx.cpp:in Function int main():
xxx.cpp:3:错误:字符阵列的初始化器 - 弦线太长
编译AA C程序时,GCC没有报告任何错误。
在我看来,正如我所期望的那样,分配正确地将所有4个字节复制到变量中。
所以我的问题归结为.....
在C正确中观察到的行为是在某处触摸不确定的行为,还是完全触摸了不确定的行为?
解决方案
简短答案:您的代码是有效的C,但无效C ++。
Long Aswer:
"four"
实际上是5个字符长 - 有一个 \0
为您添加。在节中 6.7.8初始化, ,第13段,C标准说:
字符类型的数组可以通过字符串字面的字符串初始化,该字符串在牙套中可选。字符字符串的连续字符文字(包括终止空字符,如果有空间,或数组的大小不明)初始化数组的元素。
所以 \0
当您的程序被编译时,它只是在C. C ++对其进行汇编时就被忽略了。实际上,这种特殊情况被召集 明确 在C ++规格中(部分 8.5.2字符数组, ,第2段):
没有比数组元素更多的初始化器。 [[ 例子:
char cv[4] = "asdf"; // error
由于没有隐含尾声的空间,因此不明显
’\0’
. — 结束示例 ]
其他提示
字符串“四”实际上包含五个字节:四个字母加一个零字节( 0)作为字符串终结器。自从我写了C或C ++以来已经有一段时间了,但是我想C编译器出于任何原因而默默地忽略了它。
更好的是
char four[] = "four";
您看到的是C和C ++之间的区别。 C允许您拥有额外的初始化器,这些初始化器被忽略。 C ++禁止这一点 - 如果您指定字符串(或数组)的大小 必须 足够大,可以容纳所有初始化器(包括字符串的NUL终止器),或者代码不正确(标准人士“不允许 - 不允许 - 期望编译器拒绝”)。