gpt4 book ai didi

c - malloc 在第四次调用时使程序崩溃

转载 作者:行者123 更新时间:2023-11-30 14:58:29 25 4
gpt4 key购买 nike

我正在用 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() 来重新分配 游戏->移动

关于c - malloc 在第四次调用时使程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43302694/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com