c++ - 维度字符数组之外的额外垃圾值

标签 c++ arrays pointers char

我有一个二维字符数组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() 方法中,额外的垃圾值被添加到在声明数组时指定的维度之外enter image description here

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/

相关文章:

c++ - QThreadPool 用于同时运行大量计算

javascript - 将原始数组与深度克隆进行比较,不起作用

c - 在循环之间移动数组

c++ - 关于指针取消引用的 C/C++ 问题

c++ - 从函数中删除动态大小的数组

c++ - Arduino,在for循环中破坏步进电机

C++。写入相关文件后无法显示内容

javascript - 使用一维数组中的 {{#each}} 访问值

java - 鼠标点击时如何获取二维数组中元素的位置?

c - C中如何指向一个常量整数的指针?