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

C语言删除单链表偶数节点报double free detected in tcache 2错误求解

问题原因分析

该错误的核心是删除节点后未移动当前遍历指针,导致野指针访问和重复释放:

  • 原代码仅在节点不需要删除的else分支中执行了curr = curr->next,当节点为偶数触发删除逻辑时,执行完free(del)(del等于curr)后,curr仍指向已经被释放的内存地址
  • 下一轮循环会直接访问已释放内存的curr->data字段,属于野指针访问;如果后续逻辑再次触发删除判断,就会对同一块内存执行第二次free,也就是报错提示的double free问题。
修复方案

只要在删除节点的分支末尾,将curr指针移动到下一个待遍历的节点即可,这里提供两种可行的修复写法:

写法1:分支内单独移动指针

void deleteEven (node **head){
    node *prev, *curr,*del;
    curr=*head;
    prev=NULL;
    while(curr!=NULL){
        if((curr->data)%2==0){
            del=curr;
            if(prev==NULL)
            {
                *head=curr->next;
                // 头节点删除后,curr移动到新的头节点
                curr = *head;
            }
            else
            {
                prev->next=curr->next;
                // 非头节点删除后,curr移动到prev的下一个节点
                curr = prev->next;
            }
            free(del);
        }
        else
        {
            prev=curr;
            curr=curr->next;
        }
    }
}

写法2:提前暂存下一个节点,统一移动指针(更简洁)

void deleteEven (node **head){
    node *prev, *curr, *next;
    curr=*head;
    prev=NULL;
    while(curr!=NULL){
        next = curr->next; // 提前存储下一个节点地址
        if((curr->data)%2==0){
            if(prev==NULL)
            {
                *head = next;
            }
            else
            {
                prev->next = next;
            }
            free(curr);
        }
        else
        {
            prev=curr;
        }
        curr = next; // 统一移动curr指针,无需分分支处理
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:09:00