定义一个 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++ 的地方之一,这是不允许的。
我被问及以下代码是否触发任何错误或警告:
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++ 的地方之一,这是不允许的。