0

以下代码按预期工作并输出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 被一些随机字符替换?

4

3 回答 3

1

您声明 hello 使其未初始化并填充随机字节

int main()
{
 char hello [100];
 ...
}

如果你想要零初始化数组使用

int main()
{
 char hello [100] = {0};
 ...
}
于 2020-01-09T05:25:20.123 回答
0

在我的数组hello之后的内存单元中的某个地方一定有\r的值。这就是我的角色“A”被覆盖的原因。

在其他机器上,“ABC”按预期输出,后跟随机字符。

用0初始化数组,这里特意省略,当然可以解决问题。

编辑:我让代码以二进制形式打印出每个字符,而 toPrint[5] 确实是 00001101 它是\r的 ASCII (回车)。

于 2020-01-09T05:43:04.507 回答
0

当您声明自动likechar hello [100];时,首先要了解的是100字节可以包含几乎任何内容。您必须明确地为每个字节分配值才能做/有一些有意义的事情。

当您找到\0又名NUL角色时,您将终止循环。现在,如果您注释掉\0在字符之后放置的指令c,您的循环将一直运行,直到您真正找到\0.

您的数组可能\0在某些时候包含,也可能不包含。您可能会超出100仍在寻找 a 的字节\0并调用未定义的行为。当您尝试使用一块未分配的内存时,您也会调用 UB。

于 2020-01-09T06:52:40.173 回答