假设我有以下 c char 数组:
char okaysize4[5] = "four"; // line 5
char toosmall4[4] = "four"; // line 6
char toosmall3[3] = "four"; // line 7
当我使用 gcc 4.4.7 编译时,出现以下错误:
array.c:7:警告:字符数组的初始化字符串太长
预计第 7 行会出现此错误,因为我正在尝试填充 5 个字符("four" + \0)
成一个 3 元素数组。
由于 5 元素数组足够大,因此第 5 行预计不会出现错误。
然而,令我惊讶的是第 6 行没有类似的错误。最终在toosmall4
是一个未终止的字符串,这可能会导致各种麻烦。
我的理解是c字符串文字"four"
由于空终止符,长度应为五个字符。实际上sizeof("four")
是5。那为什么编译器这里不报错呢?
有什么方法可以改变我的声明/定义/初始化,以便在这种情况下标记错误?
这是第 6 行的预期行为,来自C99标准草案部分6.7.8
初始化段落14 says (强调我的):
字符类型的数组可以通过字符串来初始化
文字,可以选择用大括号括起来。的连续字符
字符串文字 (包括终止空字符
是否有空间或者数组大小未知)初始化
数组的元素。
在C11标准草案中,具有类似措辞的相关部分是6.7.9
段落14,并且作为C常见问题解答说:
因此,该数组不是真正的 C 字符串,不能与
strcpy、printf 的 %s 格式等
正如基思·汤普森指出的那样,C++更严格的是,C++标准草案中的相关部分是这样说的:
初始值设定项的数量不得多于数组元素的数量。 [ 例子:
char cv[4] = "asdf"; // error
格式不正确,因为没有空间用于隐含的尾随“\0”。 —结束示例]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)