2017-04-09 90 views
0

我正在C中製作遊戲原子,人們輪流將原子放入網格空間。我試圖實現一個移動跟蹤系統,其中每次移動時,移動數組都會增加一個。我知道效率不是很高(我知道我不檢查malloc返回值),但只是試圖讓它至少現在工作。下面是我如何做它:malloc崩潰程序第4次電話

int move_count_temp = (game->move_count)+1; 
move_t* moves; 

//Check if it's first move 
if (game->moves == NULL) moves = (move_t*)malloc(sizeof(move_t*)); 
else moves = (move_t*)malloc(move_count_temp*sizeof(move_t*)); 

// Copy old moves over 
for (int i=0; i<game->move_count;i++) { 
    moves[i].x = game->moves[i].x; 
    moves[i].y = game->moves[i].y; 
} 

//Copy current move 
moves[move_count_temp-1].x = y_coordinate; 
moves[move_count_temp-1].y = x_coordinate; 

// Free old moves pointer and assign new one 
free(game->moves); 
game->moves = moves; 
game->move_count = move_count_temp; 

的問題是關於該樣品,在4號線mallocing moves時崩潰第四招。我一直試圖修復它一段時間,只是不知道爲什麼會發生。任何見解都會有所幫助,謝謝。

P.S.遊戲結構有一個指向move結構的指針,這是move_t結構;

struct move_t { 
    int x; 
    int y; 
}; 

回答

1

這些分配都是錯誤的:

if (game->moves == NULL) moves = (move_t*)malloc(sizeof(move_t*)); 
else moves = (move_t*)malloc(move_count_temp*sizeof(move_t*)); 

您需要爲move_t結構,不是指針分配空間move_t結構。該規範的方式做,這有助於避免這樣的錯誤:

if (game->moves == NULL) { 
    moves = malloc(sizeof *moves); 
} else { 
    moves = malloc(sizeof *moves * move_count_temp); 
} 

也就是說,沒有理由投調用在C malloc()的結果,這隻會混亂的代碼。而且,在sizeof操作數中使用標識符而不是顯式類型有助於避免發佈代碼中的錯誤,並且使代碼更易於維護。

這就是說,似乎發佈的代碼應該使用realloc()而不是malloc()free()來重新分配game->moves

+0

感謝您的幫助!看起來它現在正在工作(我投了,因爲我正在使用C++編譯器,否則它會給出一個錯誤)。 – Jayce444

+1

是的,C++確實需要演員。 –

+0

@ Jayce444在C++中使用C編譯器或代碼時,無法在C++編譯器(僅C標頭)中編譯C代碼,C不是C++的子集,C++不是C的超集。 – 12431234123412341234123