我正在用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
崩溃。我一直在尝试修复它一段时间,只是不知道为什么会发生这种情况。任何见解都会有所帮助,谢谢。
附言游戏结构有一个指向移动结构的指针,这是move_t结构;
struct move_t {
int x;
int y;
};
这些分配是错误的:
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
.