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

