0

我正在阅读 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语句中,“当前”变量如何在已经被释放后获得下一个值?我在网上搜索了一些免费链表的代码段,它们似乎在while语句中使用了两个指针以避免前面的问题。

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

谢谢!

4

1 回答 1

5

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

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

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

笔记:

  • 无需记住列表的旧标题,因此请删除current并更新head
  • 为了局部性,定义循环内下一个节点的缓冲。不确定正确的类型,没有这本书(幸运的是!),这不是问题。
于 2012-06-29T13:08:28.383 回答