C 尝试重新分配内存时出现“大小为4的无效读取”
作为C语言中第一个严肃的项目,我正在编写一个蛇游戏。但是当我试图开发蛇时,程序因SEGFAULT错误而崩溃。 所以,我试着在Valgrind玩游戏,结果是:C 尝试重新分配内存时出现“大小为4的无效读取”,c,valgrind,C,Valgrind,作为C语言中第一个严肃的项目,我正在编写一个蛇游戏。但是当我试图开发蛇时,程序因SEGFAULT错误而崩溃。 所以,我试着在Valgrind玩游戏,结果是: ==11312== 30 errors in context 7 of 7: ==11312== Invalid read of size 4 ==11312== at 0x10969E: collide (game.c:238) ==11312== by 0x108FBD: main (game.c:120) ==11312=
==11312== 30 errors in context 7 of 7:
==11312== Invalid read of size 4
==11312== at 0x10969E: collide (game.c:238)
==11312== by 0x108FBD: main (game.c:120)
==11312== Address 0x5897c60 is 0 bytes inside a block of size 40 free'd
==11312== at 0x4C31D2F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11312== by 0x109724: snake_grow (game.c:250)
==11312== by 0x108F7D: main (game.c:113)
==11312== Block was alloc'd at
==11312== at 0x4C31B25: calloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11312== by 0x109278: start (game.c:159)
==11312== by 0x108EC0: main (game.c:91)
==11312==
==11312== ERROR SUMMARY: 80 errors from 7 contexts (suppressed: 0 from 0)
正如我所说,我做错了,这就是游戏崩溃的原因。因此,问题应该在这里:
无效蛇\u生长蛇\u t*蛇{
snake->length++;
snake->body=reallocsnake->body,sizeofsnake->body[0]*snake->length;
蛇->末端=蛇->身体+蛇->长度-1;
snake->end->x=snake->prev_x;
蛇->结束->y=蛇->上一个;
}
或者我只是把指针用错了
布尔碰撞snake_t*snake,块映射[MAXY][MAXX]{
bool-ret=假;
ifmap[snake->head->y][snake->head->x]。碰撞==可碰撞{
ret=真;
}
forint i=1;i奇怪,但我找不到与我的问题类似的东西。但也许我只是不理解解决方案。当我按照WhozCraig的建议,尝试制作最小的可复制示例并进行调试时,我意外地解决了这个问题
void snake_grow(snake_t *snake){
snake->length++;
snake->body = realloc(snake->body, sizeof(snake->body[0]) * (snake->length));
snake->end = snake->body + snake->length - 1;
snake->end->x = snake->prev_x;
snake->end->y = snake->prev_y;
}
此函数除了重新分配内存外,还为snake->end设置新地址。但是还有蛇->头,它在realloc之后指向相同的地址。所以,我需要做的就是把snake->head设置到新地址
snake->head = snake->body;
地址0x5897c60是一个大小为40 free'd的块中的0字节-这表示您正在读取的内存在读取之前已被释放。这需要一个调试程序,理想情况下,需要一段时间在业务端进行调试。@WhozCraig感谢您的建议!这帮助我解决了我的问题。