【问题标题】:Why does this array of characters contain memory that is not populated?为什么这个字符数组包含未填充的内存?
【发布时间】:2015-12-04 13:21:48
【问题描述】:

我有一个由 5 个空格组成的字符数组。我正在尝试使用 for 循环用字符填充它。但是,当循环结束时,数组包含几个充满垃圾的空格。在此示例中,它应该生成一个结果为'aaaaa' 的数组,但它看起来类似于'aaaaaýýýý««««««««þîþîþ'。为什么会出现这种情况?如何防止未使用的内存空间包含在数组中?

char* array = new char[5];

for (int j = 0; j < 5; j++)
{
    array[j] = 'a';
}

【问题讨论】:

  • 您忘记在末尾添加\0
  • 您忘记在末尾添加 \0。 以及足够的数组元素来包含该 NUL。

标签: c++ arrays memory


【解决方案1】:

该数组不包含您放入其中的 5 个 a 字符以外的任何内容。 Proof:

char* array = new char[5];

for (int j = 0; j < 5; j++)
{
    array[j] = 'a';
}

for (int j = 0; j < 5; ++j)
{
    std::cout << array[j];
}

但是,我的猜测是,您实际上是在使用字符串之类的输出(或者可能在调试器中)查看数组值。像这样的:

std::cout << array;

在这种情况下,char* 被视为 以 NUL 结尾的字符串。这意味着它期望在 NUL 字符之前的所有字符都是字符串的一部分。由于您的数组没有,它只是在您的数组之后输出随机内存,直到遇到 NUL 字符。

如果要将数组视为字符串,则需要为 NUL 终止符留出额外空间:

char* array = new char[6];

for (int j = 0; j < 5; j++)
{
    array[j] = 'a';
}
array[5] = 0;

然而,如果你真的想要一个字符串,你应该使用std::string 而不是char *。 C++ 不是 C。

【讨论】:

    【解决方案2】:

    您的数组实际上“aaaaa”,但是它不包含终止零字节(ASCII NUL 字符),因此 字符串 延伸到发生在超出数组末尾的内存。

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 2023-02-01
      • 2014-07-24
      • 2023-04-02
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多