为什么这个字符数组包含未填充的内存?

时间:2015-12-04 13:21:48

标签: c++ arrays memory

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

char* array = new char[5];

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

2 个答案:

答案 0 :(得分:4)

除了您放入的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。

答案 1 :(得分:2)

您的阵列实际 &#34; aaaaa&#34;但是它不包含终止零字节(ASCII NUL字符),因此字符串扩展到任何恰好位于数组末尾的内存中。