2014-06-07 84 views
0
#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-string常量的內容複製到動態二維數組中。問題是,遊戲中會有多個可能不同大小的遊戲。我最初嘗試game.board[0] = "contents of line 0" ... game.board[23] = "contents of line 23",但這給了編譯器警告。奇怪的是,這完美地在Windows下使用MinGW,但我需要這個也可以在Linux上使用。中止使用的memcpy

+3

你可能想問自己,當你調用它時,你實際上是'memcpy''嗎?你正在對剛分配的整個行緩衝區指針進行爆破,然後試圖「刪除」一堆從未實際分配過的指針。更糟的是,你這樣做*兩次*,每次都泄漏整個動態行緩衝區。並且這被標記爲** C ** ..爲什麼呢? – WhozCraig

+2

而且地球上沒有機會「完美地運作」*任何地方*。你正在用靜態表中的'const char * *'序列替換一系列動態行緩衝區指針,然後在這些指針上調用'delete []'。編譯器後端無關緊要,你在做的是UB。 – WhozCraig

+0

這真的讓我想起用C++編寫C代碼。通過使用一些C++容器來接受一些C++習慣用法,我保證你的生活會更容易。 – shuttle87

回答

1

這條線:

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

是錯誤的,因爲:

  1. 它覆蓋的game.board的內容,這是被分配由level1內容持有的char*陣列。

  2. 你正在寫內存,你沒有分配。

你可以通過改變initboardlevel1內容複製到合適的存儲位置,並刪除上面的一行解決問題。

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.maxxgame.maxy值是顛倒的。您需要:

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

然後,你需要在initboard分配game.maxy+1字符。

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

否則,就不會有足夠的空間來容納終止空字符matrix[i]

+0

注意:OP的索引使用不正確,在調用此操作前需要解決。 'level1'數組是23個const指針對char,每個指向一個65 + 1個字符的行(包括終止符)。傳遞給它的'game'中的值是這樣的,它將分配一個由65個char指針組成的數組,然後爲每個指針分配一個char寬度爲23的元素,通過複製一個65 + 1的長度字符串來調用UB 23個字符的空間,在過程中爲每行調用UB。 – WhozCraig

+0

@WhozCraig感謝您注意到問題並讓我知道。我已經更新了答案。 –

0

您通過不調用new來分配堆棧,因此不需要在最後實際刪除該數組。當代碼運行完畢時,它將被處理!您不能在堆棧上刪除,或者您將從您無權訪問的地址刪除,因此中止。

+2

'level1'不在堆棧__上分配! –

1

char** board;更改爲vector<string> board;。擺脫initboarddelboard,並在main()去:

game.board = vector<string>(begin(level1), end(level1)); 

您可能需要包括vectorstringiterator。您也可以刪除maxxmaxy,並直接從board中讀取它們。

See it working ..看到這一切是多麼簡單?

+0

我真的很喜歡這種方式,我需要更多地瞭解矢量以及將來如何使用它們。我能夠在沒有它們的情況下實現它,但它看起來對於任何未來的項目都是更好的方法。 – Disk0rd