malloc在第4次通话时崩溃

时间:2017-04-09 03:22:25

标签: c arrays pointers crash malloc

我在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;
};

1 个答案:

答案 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