如何解决定义一个大小不包括空字符的字符数组
我被要求说明以下代码是否触发了任何错误或警告:
char string[5] = "hello";
我已经在我的计算机上对其进行了测试,并且运行良好(没有错误/警告,printf
给出了预期值(“hello”),而 strlen
给出了预期值(5))。但是,我很想说这会产生某种未定义的行为。我想这无论如何都被认为是一种不好的做法,但是它会导致错误,因为我们没有明确允许一个字节作为空字符吗?
解决方法
这是允许的。资料来源:K&R C,ANSI C 版本。 “一个字符数组可以用那么多字符的字符串初始化。”这会产生一个非空终止的字符串——谨慎使用。这意味着 printf("%s",string);
未定义,但 printf("%.5s",string);
已定义。
看起来工作可能是未定义行为的结果。事实上,在这样的例子中,文件的 .data
区域中的最后一个东西将是字符串,然后用零填充以匹配机器对齐。在堆栈上,当程序第一次启动时,main
中未初始化的内存往往具有相同的清零条件(情况并非总是如此,并且在任何情况下都不应该有任何代码永远 取决于此)。从而导致一切似乎都有效。但是当程序变大时,它会无缘无故地停止工作,因为内存布局或初始化发生了变化。
在 C 中,编译器将允许这样做,相当于
char string[5] = { 'h','e','l','o' };
请注意,不会添加字符串空终止符。
参见例如this array initialization reference。
另请注意,这是 C 与 C++ 不同的许多地方之一,这是不允许的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。