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终止器),或者代码不正确(标准人士“不允许 - 不允许 - 期望编译器拒绝”)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top