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

C语言中Valgrind检测到Invalid read of size 8问题求助

排查Valgrind无效内存读取错误及修复方案

让我帮你拆解一下这个Valgrind报错的问题,你的Vide_config函数里有好几处明显的逻辑错误,直接导致了无效内存读取:

核心错误点

  • 未初始化的野指针tmp
    你定义了dspList_t *tmp;但没有给它赋初始值,直接在while循环条件里判断tmp!= NULL。此时tmp是一个野指针,指向的是随机内存地址(Valgrind里显示的0x3ad6就是这种无意义的野地址),第一次循环就会触发无效内存读取操作。

  • 内存释放的双重错误
    代码里重复执行了free(tmp->requete_json);,却完全遗漏了对tmp->reponse_json的释放——这不仅会造成内存泄漏,重复释放的操作还可能触发后续的内存异常。

  • 循环执行逻辑颠倒
    在还没将tmp指向当前要处理的节点时,就直接去访问tmp的成员,整个节点遍历和释放的顺序完全错乱。

修复后的完整Vide_config函数

static boolean Vide_config(dspList_t **p) {
    boolean erreur = false;
    dspList_t *tmp;
    // 只需要判断当前链表头是否为空即可启动循环
    while (*p != NULL) {
        tmp = *p; // 先让tmp指向当前要删除的节点
        // 依次释放所有动态分配的字符串成员
        free(tmp->mesfct);
        free(tmp->processus);
        free(tmp->requete_json);
        free(tmp->reponse_json); // 补上之前遗漏的释放操作
        // 将链表头指针前移到上一个节点
        *p = (*p)->prec;
        // 最后释放当前节点本身
        free(tmp);
    }
    return erreur;
}

另外顺便提一下,你的Ajout_element_config函数里有个小瑕疵:当calloc分配内存失败时,你设置了erreur = true,但返回的是-1——而函数的返回类型是boolean(通常对应0/1的布尔值),这里应该返回erreur或者直接return true;,保持返回值类型的一致性,避免潜在的类型兼容问题。

内容的提问来源于stack exchange,提问作者Embeded_developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:49:16