Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用memcpy填充动态2d数组后删除该数组时中止(内核转储) #包括 #包括 使用名称空间std; 常量字符*level1[23]= { “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X K X D X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X XXXXX X”, “X X XXXXX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X X X X X XXXXX”, “X X xxxxx X xxxxxxxxx X X X xxxxx X”, “X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X XXXXXXXXXXXXXX D X XXXXK X KX”, “X X X KX XXXXXX XXXXXX XXXXXX X XXXXXX X XXXXXX DX”, “X X X X X X X X X X X X X X X D X”, “X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X X XXXXXX X”, “X X X X X KX X X”, “X X X X X X xxxxxxxxxx X xxxxxxxxxx X xxxxxxxxxx X xxxxxx X”, “X X X X X X KX X X X X”, “X X X X X X X X X X xxxxxxxxx X”, “X X X X xxxxxxxxx X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X X X X X X X X X X X X X X X”, “X X XXXXXXXXXXXXX X XXXXXXXXX X X XXXXXXXXXXXXXX X”, “X X X”, “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” }; //玩家结构 结构播放器信息 { int x;//x位置 int y;//y位置 int keys;//播放器拥有的键数 }; //当前游戏信息结构 结构游戏信息 { char**board;//迷宫阵列 int maxx;//迷宫数组X坐标的最大大小 int maxy;//迷宫数组X坐标的最大大小 int level;//迷宫的级别 playerinfo player;//链接到播放器数据结构 }; //初始化存储迷宫的动态数组 char**initboard(gameinfo游戏) { 字符**矩阵=新字符*[game.maxx]; 对于(int i=0;i_C++_Arrays_String_Pointers - Fatal编程技术网

C++ 使用memcpy填充动态2d数组后删除该数组时中止(内核转储) #包括 #包括 使用名称空间std; 常量字符*level1[23]= { “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X K X D X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X XXXXX X”, “X X XXXXX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X X X X X XXXXX”, “X X xxxxx X xxxxxxxxx X X X xxxxx X”, “X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X XXXXXXXXXXXXXX D X XXXXK X KX”, “X X X KX XXXXXX XXXXXX XXXXXX X XXXXXX X XXXXXX DX”, “X X X X X X X X X X X X X X X D X”, “X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X X XXXXXX X”, “X X X X X KX X X”, “X X X X X X xxxxxxxxxx X xxxxxxxxxx X xxxxxxxxxx X xxxxxx X”, “X X X X X X KX X X X X”, “X X X X X X X X X X xxxxxxxxx X”, “X X X X xxxxxxxxx X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X X X X X X X X X X X X X X X”, “X X XXXXXXXXXXXXX X XXXXXXXXX X X XXXXXXXXXXXXXX X”, “X X X”, “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” }; //玩家结构 结构播放器信息 { int x;//x位置 int y;//y位置 int keys;//播放器拥有的键数 }; //当前游戏信息结构 结构游戏信息 { char**board;//迷宫阵列 int maxx;//迷宫数组X坐标的最大大小 int maxy;//迷宫数组X坐标的最大大小 int level;//迷宫的级别 playerinfo player;//链接到播放器数据结构 }; //初始化存储迷宫的动态数组 char**initboard(gameinfo游戏) { 字符**矩阵=新字符*[game.maxx]; 对于(int i=0;i

C++ 使用memcpy填充动态2d数组后删除该数组时中止(内核转储) #包括 #包括 使用名称空间std; 常量字符*level1[23]= { “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”, “X X K X D X”, “X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X XXXXX X”, “X X XXXXX X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X”, “X X X X X X X XXXXX”, “X X xxxxx X xxxxxxxxx X X X xxxxx X”, “X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X XXXXXXXXXXXXXX D X XXXXK X KX”, “X X X KX XXXXXX XXXXXX XXXXXX X XXXXXX X XXXXXX DX”, “X X X X X X X X X X X X X X X D X”, “X X X X X XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX X X XXXXXX X”, “X X X X X KX X X”, “X X X X X X xxxxxxxxxx X xxxxxxxxxx X xxxxxxxxxx X xxxxxx X”, “X X X X X X KX X X X X”, “X X X X X X X X X X xxxxxxxxx X”, “X X X X xxxxxxxxx X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X, “X X X X X X X X X X X X X X X”, “X X XXXXXXXXXXXXX X XXXXXXXXX X X XXXXXXXXXXXXXX X”, “X X X”, “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” }; //玩家结构 结构播放器信息 { int x;//x位置 int y;//y位置 int keys;//播放器拥有的键数 }; //当前游戏信息结构 结构游戏信息 { char**board;//迷宫阵列 int maxx;//迷宫数组X坐标的最大大小 int maxy;//迷宫数组X坐标的最大大小 int level;//迷宫的级别 playerinfo player;//链接到播放器数据结构 }; //初始化存储迷宫的动态数组 char**initboard(gameinfo游戏) { 字符**矩阵=新字符*[game.maxx]; 对于(int i=0;i,c++,arrays,string,pointers,C++,Arrays,String,Pointers,您通过不调用new在堆栈中分配了此数组,因此无需在最后实际删除此数组。代码运行完成后,将处理此数组!您无法在堆栈上删除,或者将从您无权访问的地址删除,因此中止。此行: #include <iostream> #include <cstring> using namespace std; const char* level1[23] = { "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

您通过不调用new在堆栈中分配了此数组,因此无需在最后实际删除此数组。代码运行完成后,将处理此数组!您无法在堆栈上删除,或者将从您无权访问的地址删除,因此中止。

此行:

#include <iostream>
#include <cstring>

using namespace std;

const char* level1[23] =
{
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"X                                                               X",
"X  XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX     X",
"X  X K                          X            D               X  X",
"X  XXXXXXXXXXXXXXXXXXXXXX  XXXXXXXXX  XXXXXXXXXXXXXXXXXXXXX  X  X",
"X  X  X        X                  X                   XXXXX  X  X",
"X  X   XXXXX   X  XXXXXXXXXXXXXX  XXXXXXXX  XXXXXXXXXXX      X  X",
"X  X        X  X        D      X  X      X   X        X  XXXXX  X",
"X  X  XXXX  X  X  XXXXXXXXXX   X     X          X  XXXX      X  X",
"X        X        X   X  E X  XXXXXXXXX  XXXXXXXX  X  XXXXX  X  X",
"X  XXXXXXXXXXXXXXXX   D    X  XXK      X        X  X  X     KX  X",
"X  X     X     X KX   XXXXXX  XXXXXX  XXXXXXXX  X  X  X  XXXXXXDX",
"X  X  X  X  X  X  X           XXX  X            X  X  X  D   X  X",
"X  X  X  X  X  X  XXXXXXXXXXXXXXX  XXXXXXXXXXXXXX  X  XXXXX  X  X",
"X  X  X  X  X  X  X   X               X           KX  X      X  X",
"X  X  X  X  X  X  X   X  XXXXXXXXXXX  X  XXXXXXXXXXX  X  XXXXX  X",
"X  X  X  X  X  X  X   X  X     X  KX  X  X            X      X  X",
"X     X  X  X  X  X      X  X     XX  X  X     XXXXXXXXXXXXX X  X",
"X  X  X  X  X  X  X   X  X  XXXXXXXX  X  X      X     X      X  X",
"X  X  X     X     X   X  X         X  X  X   X     X         X  X",
"X  X  XXXXXXXXXXXXX   X  XXXXXXXX  X  X  X  XXXXXXXXXXXXXXXXXX  X",
"XS X                                                            X",
"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
};

// Player structure
struct playerinfo
{
    int x;      // X position
    int y;      // Y position
    int keys;   // Number of keys the player has
};

// Current game info structure
struct gameinfo
{
    char** board;       // The maze array
    int maxx;           // Max size of the maze array X coordinate
    int maxy;           // Max size of the maze array X coordinate
    int level;          // The level of the maze
    playerinfo player;        // Link to player data struct
};

// Initializes the dynamic array that stores the maze
char** initboard(gameinfo game)
{
    char** matrix = new char*[game.maxx];

    for (int i=0; i<game.maxx; i++)
        matrix[i] = new char[game.maxy];

    return matrix;

}

void delboard(gameinfo game)
{
    for (int i=0;i<game.maxx;i++)
        delete [] game.board[i];
    delete [] game.board;
}

int main()
{
    gameinfo game;

    game.maxx=65;
    game.maxy=23;

    game.board = initboard(game);
    memcpy(game.board,level1,sizeof(level1));

    delboard(game);
}
这是错误的,因为:

  • 它覆盖
    game.board
    的内容,该游戏板被
    level1
    的内容分配用来保存
    char*
    数组

  • 您正在写入未分配的内存

  • 您可以通过更改
    initboard
    level1
    的内容复制到正确的内存位置并删除上面的行来解决此问题

    memcpy(game.board,level1,sizeof(level1));
    
    然后,您需要在
    initboard
    中分配
    game.maxy+1
    字符

    game.maxx=23; // Not 65;
    game.maxy=65  // Not 23;
    

    否则,在
    matrix[i]

    中将
    char**board;
    更改为
    vector board;
    中,将没有足够的空间容纳终止的空字符。清除
    initboard
    delboard
    ,并在
    main()
    中:

            matrix[i] = new char[game.maxy+1];
    
    game.board=vector(开始(级别1),结束(级别1));
    
    您可能需要包含
    向量
    字符串
    迭代器
    。您还可以删除
    maxx
    maxy
    并直接从
    读取它们


    …看看这一切有多简单?

    你可能想问问自己,当你调用它时,你实际上在
    memcpy
    '做什么?你正在对刚刚分配的整组行缓冲区指针进行轰炸,然后试图
    删除[]
    大量指针从未实际分配过。更糟糕的是,您这样做了两次,每次都会泄漏整个动态行缓冲区集。这被标记为C。为什么,确切地说?这根本不可能“完美工作”您正在用静态表中的
    const char*
    序列替换动态行缓冲区指针序列,然后调用
    delete[]在这些指针上,编译器后端并不重要,你所做的是UB。这确实让我感到震惊,因为我尝试用C++编写C代码。使用C++容器中的一些C++习语,我保证你的生活会变得简单很多。注意:OP的索引使用不正确,在调用这个之前需要加以解决。
    level1
    数组是指向字符的23个常量指针,每个指针指向一行65+1个字符宽(包括终止符)。传递给此的
    game
    中的值是这样的:它将分配一个包含65个字符指针的数组,然后为每个指针分配一个23个元素宽的字符缓冲区,通过将65+1长度的字符串复制到23个字符的空间中来调用UB,并为过程中的每一行调用UB。@WhozCraig感谢您注意到问题并让我知道w、 我已经更新了答案。
    level1
    不是“在堆栈上分配的”!我真的很喜欢它的工作方式,我需要学习更多关于vector的知识以及如何在将来使用它们。我能够在没有它们的情况下使它工作,但对于任何未来的项目来说,它看起来都是一种更好的方法。
            matrix[i] = new char[game.maxy+1];
    
    game.board = vector<string>( begin(level1), end(level1) );