2017-04-09 94 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