我有一个二维字符数组char** 字段
。我有一个方法 get_field()
可以复制这个 char 数组并返回这个拷贝。
char** Game::get_field() {
char** copy = new char*[this->width_field];
for (unsigned int i = 0; i < this->width_field; i++)
copy[i] = new char[this->length_field];
for (unsigned int i = 0; i < this->width_field; i++) {
for (unsigned int j = 0; j < this->length_field; j++)
copy[i][j] = this->field[i][j];
}
return copy;
}
当我将拷贝的值输出到控制台时,我在每一行之后得到一些垃圾值。但是,char 数组的每一行都包含“\0”字符以标记字符串的结尾。在对调试器进行一些调查后,我发现在 get_field()
方法中,额外的垃圾值被添加到在声明数组时指定的维度之外。
当 length_field
等于 52 时,我得到 51 个破折号加上图像中的 '\0' 字符,然后是一些额外的垃圾值。这些垃圾值从何而来,我该如何摆脱它们?
[编辑:] 这是向控制台输出的代码:
char** field = game->get_field();
for (unsigned int i = 0; i < 13; i++) {
cout << field[i] << endl;
}
这是设置初始字段的代码:
this->field = new char*[this->width_field];
for (unsigned int i = 0; i < this->width_field; i++)
this->field[i] = new char[this->length_field];
this->setup_field();
void Game::setup_field(){
this->field[0] = "---------------------------------------------------\n\0";
this->field[1] = "| | |\n\0";
this->field[2] = "| | |\n\0";
this->field[3] = "| | |\n\0";
this->field[4] = "|---- | ----|\n\0";
this->field[5] = "| | -|- | |\n\0";
this->field[6] = "| | | | | | |\n\0";
this->field[7] = "| | -|- | |\n\0";
this->field[8] = "|---- | ----|\n\0";
this->field[9] = "| | |\n\0";
this->field[10] = "| | |\n\0";
this->field[11] = "| | |\n\0";
this->field[12] = "---------------------------------------------------\n\0";
}
最佳答案
C++ 标准和 Microsoft 实现均未对不属于您的内存提供任何保证。
出于任何原因访问它是未定义的行为=>任何事情都可能发生。
如果您将不指向以 0 结尾的字符串的 char*
传递给期望以 0 结尾的字符串的函数,它将访问越界内存,直到找到 0 或崩溃某种方式。
这应该足以解释您的“添加的垃圾”。
旁注:有什么理由不能在一个 block 中分配所有需要的内存?
正如您稍后在提示后添加的那样,您复制的行不是以 0 结尾。
任何行的完整大小:长度 + 1: 51 可打印 + 1 换行符 + 1 终止符
提示:如果您不能使用 strdup
和/或 memdup
,请自行定义它们。
关于c++ - 维度字符数组之外的额外垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24292686/