释放链表节点后能否访问已释放指针?需提前存储后继节点吗?
链表节点释放后的指针访问问题
绝对不能在调用free(previous_node->next)之后,再去访问previous_node->next->next来更新前驱节点的指针。
原因很简单:free会把目标节点占用的内存归还给系统,这块内存之后可能被重新分配、覆盖,甚至变成无效内存区域。此时访问已释放内存里的next指针属于未定义行为——程序可能直接崩溃,也可能读取到垃圾值导致链表结构乱掉,哪怕你看到编译器做了优化,那也只是特定环境下的巧合,完全不能依赖。
正确的操作必须是先把目标节点的next地址存到变量里,再释放节点:
// 先保存要释放节点的下一个节点地址 struct Node *temp = previous_node->next->next; // 释放目标节点 free(previous_node->next); // 更新前驱节点的next指针 previous_node->next = temp;
这种写法是标准且安全的,不管编译器有没有优化,都能保证逻辑的正确性,避免未定义行为带来的各种问题。
内容的提问来源于stack exchange,提问作者Egemen Yalın
相关产品推荐
相关产品推荐

