使用realloc缩小malloc数组时触发0xC0000005错误的问题
问题分析与修复
核心错误:realloc的内存大小计算错误
你调用realloc时使用了sizeof(slugs),但slugs是指针类型,sizeof(slugs)得到的是指针本身的字节数(32位系统为4字节,64位为8字节),而非单个slug结构体的实际大小。这会导致分配的内存远小于需求,触发内存访问违规(错误码0xC0000005)。
其他潜在问题
- 初始化顺序错误:你在
slugCount未初始化时就用它分配内存,初始malloc的大小是随机值,会引发后续内存隐患,应先初始化slugCount再调用malloc。 - 结构体浅拷贝的内存泄漏:
slug结构体包含char *direction指针,直接用slugs[z] = slugs[z + 1]做浅拷贝,会导致被覆盖的slugs[z].direction指向的内存无法释放,造成内存泄漏。
修复后的代码示例
typedef struct { float reproduce_prob; int mature; int life; int age; char *direction; int X; int Y; } slug; // 先初始化计数,再分配内存 int slugCount = 0; slug *slugs = (slug *) malloc(sizeof(slug) * (slugCount + 1)); // ...其他业务代码... if (slugCheck(theGrid, frogs[i])) { int pos = feedFrog(frogs[i], slugs, slugCount); // 释放被移除元素的动态内存,避免泄漏 free(slugs[pos].direction); // 移动数组元素 for (int z = pos; z < slugCount - 1; z++) { slugs[z] = slugs[z + 1]; } slugCount--; // 用sizeof(slug)计算单个结构体大小,重新分配内存 slug *temp_slugs = realloc(slugs, sizeof(slug) * (slugCount + 1)); // 检查realloc是否成功,防止内存泄漏 if (temp_slugs != NULL) { slugs = temp_slugs; } else { // 处理分配失败的情况,比如释放原有内存并终止程序 free(slugs); // 可添加错误提示逻辑 } frogs[i].initHung = 0; }
关键修复点
- 将
sizeof(slugs)替换为sizeof(slug),确保按结构体实际大小分配内存。 - 调整初始化顺序,先设置
slugCount为0,再执行malloc。 - 移除元素前,先释放
direction指向的动态内存。 - 用临时指针接收
realloc返回值,避免分配失败时丢失原有内存指针。
内容的提问来源于stack exchange,提问作者BZS
相关产品推荐
相关产品推荐

