我在C中制作游戏原子,人们轮流将原子放入网格空间。我正在尝试实现一个移动跟踪系统,其中每次移动时,移动数组都会增加一个。我知道效率不高(而且我知道我没有检查malloc返回值),但只是试图让它至少在现在工作。以下是我的表现:
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步,它在该样本的第4行崩溃,当时使用moves
。我一直试图修复它一段时间,只是不知道它为什么会发生。任何见解都会有所帮助,谢谢。
P.S。游戏结构有一个指向移动结构的指针,这是move_t结构;
struct move_t {
int x;
int y;
};
答案 0 :(得分: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
。