You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用realloc缩小malloc数组时触发0xC0000005错误的问题

问题分析与修复

核心错误:realloc的内存大小计算错误

你调用realloc时使用了sizeof(slugs),但slugs是指针类型,sizeof(slugs)得到的是指针本身的字节数(32位系统为4字节,64位为8字节),而非单个slug结构体的实际大小。这会导致分配的内存远小于需求,触发内存访问违规(错误码0xC0000005)。

其他潜在问题

  1. 初始化顺序错误:你在slugCount未初始化时就用它分配内存,初始malloc的大小是随机值,会引发后续内存隐患,应先初始化slugCount再调用malloc。
  2. 结构体浅拷贝的内存泄漏: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:55:45