int main()
{
char a[7] = "Network";
return 0;
}
A 字符串字面量在 C 中是内部终止的空字符。因此,上面的代码应该给出编译错误,因为字符串文字的实际长度Network
是 8 并且它不能放入char[7]
array.
然而,gcc(即使-Wall
)在 Ubuntu 上编译此代码没有任何错误或警告。
为什么 gcc 允许这样做而不将其标记为编译错误?
当 char 数组大小小于字符串文字时,gcc 仅给出警告(仍然没有错误!)。例如,它会警告:
char a[6] = "Network";
[有关的]视觉C++ 2012给出编译错误char a[7]
:
1>d:\main.cpp(3): error C2117: 'a' : array bounds overflow
1> d:\main.cpp(3) : see declaration of 'a'
使用大于它的字符串文字初始化 char 数组在 C 中没问题,但在 C++ 中则错误。这解释了 gcc 和 VC++ 之间行为的差异。
如果用 VC++ 编译与 C 文件相同的文件,则不会出现错误。如果使用 g++ 将其编译为 C++ 文件,则会出现错误。
C 标准说:
字符类型的数组可以通过字符串来初始化
文字或 UTF-8 字符串文字,可以选择用大括号括起来。
字符串文字的连续字节(包括终止 null
如果有空间或数组大小未知,则为字符)
初始化数组的元素。
[...]
实施例8
声明
char s[] = "abc", t[3] = "abc";
定义“普通”字符数组对象s
and t
其元素已初始化
与字符串文字。
该声明与
char s[] = { 'a', 'b', 'c', '\0' },
t[] = { 'a', 'b', 'c' };
(《条例》第 6.7.9 条C11标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf,最终标准中的实际措辞可能有所不同。)
这意味着如果数组没有空间容纳终止字符,则删除终止字符是完全正确的。这可能是出乎意料的,但这正是该语言应该如何工作的,并且是一个(至少对我而言)众所周知的功能。
相反,C++ 标准说:
初始值设定项的数量不得多于数组元素的数量。
Example:
char cv[4] = "asdf"; // error
格式不正确,因为没有空间用于隐含的尾随“\0”。
(C++ 2011 草案的 8.5.2n3242 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)