定义一个 char 数组,其大小不计算空字符

Define a char array with a size which does not count the null character

我被问及以下代码是否触发任何错误或警告:

char string[5] = "hello";

我已经在我的电脑上测试过了,它运行良好(没有 error/warning 和 printf 给出了预期值(“你好”)和 strlen 给出了预期值(5 )).但是,我很想说这会产生某种未定义的行为。我想这无论如何都被认为是一种不好的做法,但它会导致错误吗,因为我们没有明确允许空字符的字节?

这是允许的。资料来源:K&R C,ANSI C 版本。 “一个 char 数组可以用那么多字符的字符串初始化。”这会导致字符串不是空终止的——谨慎使用。这意味着 printf("%s", string); 未定义,但 printf("%.5s", string); 已定义。

看似正常工作可能是未定义行为的结果。事实上,在这样的示例中,文件 .data 区域中的最后一件事将是字符串,然后用零填充以匹配机器对齐。在堆栈上,当程序首次启动时,main 中未初始化的内存往往具有相同的清零条件(情况并非总是如此,在任何情况下都不应该 ever 取决于这个)。从而导致一切似乎都有效。但是当程序变大时,它会无缘无故地停止工作,因为内存布局或初始化发生了变化。

在 C 中,编译器将允许这样做,等同于

char string[5] = { 'h', 'e', 'l', 'l', 'o' };

请注意,不会添加字符串空终止符。

参见例如this array initialization reference.

另请注意,这是 许多 C 不同于 C++ 的地方之一,这是不允许的。