7
int main(void)
{
    char four[4] = "four";
    return 0;
}

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

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

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

编译一个 C 程序时,GCC 没有报错。

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

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

在 C 语言中观察到的行为是正确的,还是我在某处触及了未定义的行为,还是完全是别的东西?

4

4 回答 4

22
于 2010-08-19T16:44:03.163 回答
2

会更好

char four[] = "four";
于 2010-08-19T16:55:30.150 回答
2

字符串“four”实际上包含五个字节:四个字母加上一个零字节 (\0) 作为字符串终止符。自从我编写 C 或 C++ 以来已经有一段时间了,但我猜 C 编译器会出于某种原因默默地忽略它。

于 2010-08-19T16:46:12.923 回答
1

您所看到的是 C 和 C++ 之间的区别。C 允许您有额外的初始化程序,这些初始化程序将被忽略。C++ 禁止这样做——如果您为字符串(或数组)指定大小,它必须足够大以容纳所有初始值设定项(包括 NUL 终止符,在字符串的情况下),或者代码格式错误(标准对于“这是不允许的——期望编译器拒绝它”)。

于 2010-08-19T17:04:20.847 回答