C Primer Plus的第17章 - 关于如何释放整个链表

时间:2012-06-29 13:06:28

标签: c list malloc free

我正在阅读C Primer Plus的第17章,这是在书中释放链表的代码段:

/* Program done, so free allocated memory */
    current = head;
    while (current != NULL)
    {
        free(current);
        current = current->next;
    }
    printf("Bye!\n");
    return 0;

}

在while语句中,“current”变量在被释放后如何获得下一个值?我在网上搜索了一些代码段以释放链接列表,并且他们似乎在while语句中使用了两个指针以避免之前的问题。

但是,如果这是一个错误,我在勘误表中找不到这个。那么有什么意见吗?

谢谢!

1 个答案:

答案 0 :(得分:5)

是的,这显然是一个错误。访问已经free()的堆内存会调用未定义的行为。坏书!

正确的方法是在调用next之前缓冲free()指针:

while (head != NULL)
{
    struct list_node *next = head->next;
    free(head);
    head = next;
}

注意:

  • 无需记住列表的旧标题,因此请放弃current并更新head
  • 为了当地的目的,定义循环中下一个节点的缓冲。不确定正确的类型,没有这本书(幸运的是!)并且它不在问题中。