Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试重新分配内存时出现“大小为4的无效读取”_C_Valgrind - Fatal编程技术网

C 尝试重新分配内存时出现“大小为4的无效读取”

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=

作为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==  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;ilength;i++{ ifsnake->body[i].x==snake->head->x{ 如果蛇->身体[i].y==蛇->头->y{ ret=真; } } } 返回ret; }
奇怪,但我找不到与我的问题类似的东西。但也许我只是不理解解决方案。

当我按照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感谢您的建议!这帮助我解决了我的问题。