【发布时间】:2020-04-26 16:26:48
【问题描述】:
以下代码按预期工作并输出ABC:
#include <stdio.h>
void printString (char toPrint [100]);
int main()
{
char hello [100];
hello[0] = 'A';
hello[1] = 'B';
hello[2] = 'C';
hello[3] = '\0';
printString(hello);
}
void printString (char toPrint [100])
{
int i = 0;
while (toPrint[i] != '\0')
{
printf("%c", toPrint[i]);
++i;
}
}
但如果我删除添加空字符的行
hallo[3] = '\0';
我得到像 wBCÇL, ╗BCÄL, ┬BCNL 这样的随机输出。
为什么会这样?我期望 printString() 中的循环永远运行,因为它没有遇到“\ 0”,但是“A”、“B”和“C”发生了什么?为什么 B 和 C 仍然出现在输出中,但 A 被替换为一些随机字符?
【问题讨论】:
-
可能是因为它碰巧碰到了 '\r' 的值,这会将光标重置到我猜测的行首。
-
因为在第二种情况下,您有一个字节数组(不是字符串),在您希望的地方没有空字节。使用
char hello[100] = "";或等效项将所有内容初始化为空字节。 -
@Jonathan Leffler 这并不能解释我眼中的这种行为。是的,空字节(故意)丢失。然后循环不应该结束,直到它偶然在内存中的某个地方找到一些空字节。我明白了。但是为什么最初的'A'被随机字符代替?这与缺少空字符有什么关系?
-
未定义的行为可以为所欲为,而且没有任何意义。正如其他人所建议的那样,其中一个字符可能是回车符。
-
事实上:如果我在不同的机器上运行相同的代码,我会得到“ABC”后跟随机字符。从中学到了很多,谢谢!
标签: c printf null-terminated null-character