c++ - 使用 memcpy 填充后删除动态二维数组时中止(核心转储)

标签 c++ arrays string pointers

<分区>

#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);
}

核心转储发生在“delete [] game.board[i];”的第一步......这只发生在 memcpy() 行用来。我想要做的是将 c 字符串 const 的内容复制到动态二维数组。关键是将有可能不同大小的多个级别作为 game.board 放入。我最初尝试过 game.board[0] = "contents of line 0" ... game.board[23] = "contents of line 23",但是给出了编译器警告。奇怪的是,这在 Windows 下使用 MinGW 时效果很好,但我需要它也能在 Linux 上使用。

最佳答案

这一行:

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

是错误的,因为:

  1. 它覆盖game.board的内容, 它被分配来保存 char* 的数组按level1的内容.

  2. 您正在覆盖未分配的内存。

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

char** initboard(gameinfo game)
{
    char** matrix = new char*[game.maxx];

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

        // Copy the contents of `level1[i]` to `matrix[i]`.
        strpcy(matrix[i], level1[i]);
    }

    return matrix;
}

更新(感谢@WhozCraig 敏锐的眼光)

您用于 game.maxx 的值和 game.maxy被逆转。你需要:

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

然后,你需要分配game.maxy+1 initboard 中的字符.

        matrix[i] = new char[game.maxy+1];

否则,matrix[i] 中将没有足够的空间来容纳终止空字符。 .

关于c++ - 使用 memcpy 填充后删除动态二维数组时中止(核心转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24095220/

相关文章:

c++ - 使用虚函数调用时节省堆栈空间

c++ - 在 C++ 中将 Mutex 和 lock_guard 与 vector 一起使用

c - 有哪些第三方选项可用于在 C 中处理字符串?

c - C中String tokenizer的奇怪行为

c++ - 结构 vector : adding elements C++

c++ - 检查值是否存在于数组的所有索引中

java - 在java中设置构造函数和一些对象

python - 在 Python 中将文件名拆分为单词和数字

c - 如何在共享内存中的矩阵上写入?

c++ - Win32 仍然是 Windows 游戏开发的最佳选择?