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

C++ 维度字符数组之外的额外垃圾值,c++,arrays,pointers,char,C++,Arrays,Pointers,Char,我有一个二维字符数组char**field。我有一个方法get_field(),它复制这个字符数组并返回这个副本 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];

我有一个二维字符数组
char**field
。我有一个方法
get_field()
,它复制这个字符数组并返回这个副本

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;
}
这是如何设置初始字段的代码:

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";
}
this->field=newchar*[this->width_field];
对于(无符号整数i=0;iwidth\u字段;i++)
this->field[i]=新字符[this->length_field];
此->设置_字段();
无效游戏::设置_字段(){
此->字段[0]=“-------------------------------------------------------------\n\0”;
此->字段[1]=“|||\n\0”;
此->字段[2]=“|||\n\0”;
此->字段[3]=“|||\n\0”;
此->字段[4]=“|----------|----\n\0”;
此->字段[5]=“||-|-| | \n\0”;
此->字段[6]=“| | | | | | | \n\0”;
此->字段[7]=“||-|-| | \n\0”;
此->字段[8]=“|----------|----\n\0”;
此->字段[9]=“|||\n\0”;
此->字段[10]=“|||\n\0”;
此->字段[11]=“|||\n\0”;
此->字段[12]=“--------------------------------------\n\0”;
}

< C++标准和微软实现都不提供不属于你的内存的任何保证。

出于任何原因访问它都是未定义的行为=>任何事情都可能发生

如果您将一个不指向以0结尾的字符串的
char*
交给一个需要该字符串的函数,它将访问越界内存,直到它找到一个0或以某种方式崩溃。
这足以解释你的“添加垃圾”

旁注:有什么原因不能在一个块中分配所有需要的内存吗

如您稍后在提示后添加的,您复制的行不是以0结尾的
任何行的全尺寸:长度+1:51可打印+1新行+1终止符


提示:如果不能使用<代码> StutUp和/或<代码> Mediupp,请自行定义。

< P>,C++标准和微软实现都不提供不属于您的内存的任何保证。

出于任何原因访问它都是未定义的行为=>任何事情都可能发生

如果您将一个不指向以0结尾的字符串的
char*
交给一个需要该字符串的函数,它将访问越界内存,直到它找到一个0或以某种方式崩溃。
这足以解释你的“添加垃圾”

旁注:有什么原因不能在一个块中分配所有需要的内存吗

如您稍后在提示后添加的,您复制的行不是以0结尾的
任何行的全尺寸:长度+1:51可打印+1新行+1终止符


提示:如果您不能使用strdup和/或memdup,请自己定义它们。

您真的不想这样做。试试这个:

#include <vector>
#include <string>

std::vector<std::string> Game::get_field() {
    std::vector<std::string> copy(this->width_field);

    for (unsigned int i = 0; i < this->width_field; i++) {
        for (unsigned int j = 0; j < this->length_field; j++) {
            copy[i].push_back(this->field[i][j]);
        }
    }

    return copy;
}
#包括
#包括
std::vector Game::get_field(){
std::矢量复制(此->宽度_字段);
对于(无符号整数i=0;iwidth\u字段;i++){
对于(无符号整数j=0;jlength\u字段;j++){
复制[i]。将_向后推(此->字段[i][j]);
}
}
返回副本;
}

你真的不想那样做。试试这个:

#include <vector>
#include <string>

std::vector<std::string> Game::get_field() {
    std::vector<std::string> copy(this->width_field);

    for (unsigned int i = 0; i < this->width_field; i++) {
        for (unsigned int j = 0; j < this->length_field; j++) {
            copy[i].push_back(this->field[i][j]);
        }
    }

    return copy;
}
#包括
#包括
std::vector Game::get_field(){
std::矢量复制(此->宽度_字段);
对于(无符号整数i=0;iwidth\u字段;i++){
对于(无符号整数j=0;jlength\u字段;j++){
复制[i]。将_向后推(此->字段[i][j]);
}
}
返回副本;
}
当length_字段等于52时,我得到51个破折号加上“\0”字符

实际上,您的
Game::setup\u字段()中有54个字符。
字符串:

  • 51破折号
  • 一个\n
  • 一个\0
  • 一个隐式\0结束字符串
因此,在您的
Game::get_field()
方法中,当您仅复制52个字符(在\n处停止)时,您不会复制\0字符,从而导致未终止的字符串

在初始化或复制内容时,最好使用
向量
,或者更加小心/明确地指定数组长度

当length_字段等于52时,我得到51个破折号加上“\0”字符

实际上,您的
Game::setup\u字段()中有54个字符。
字符串:

  • 51破折号
  • 一个\n
  • 一个\0
  • 一个隐式\0结束字符串
因此,在您的
Game::get_field()
方法中,当您仅复制52个字符(在\n处停止)时,您不会复制\0字符,从而导致未终止的字符串


在初始化或复制内容时,最好使用
向量
,或者更加小心/明确数组长度。

首先考虑的是长度和宽度是否与您认为的相同?是的。使用调试器检查。有趣的代码是将数据输出到控制台的代码(以及初始化数据的代码)。@Deduplicator将代码添加到原始帖子中。我确信您希望在
设置字段中使用
strcpy()
,而不是丢弃新分配的空间(内存泄漏)并指定字符串文字来代替它。
width\u字段
length\u字段
设置在哪里?首先想到的是长度和宽度是您认为的吗?是的。使用调试器检查。有趣的代码是将数据输出到控制台的代码(以及初始化数据的代码)。@Deduplicator将代码添加到原始帖子中。我确信您希望在
设置字段中使用
strcpy()
,而不是