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
相关产品推荐
相关产品推荐

