0

我正在尝试使用以下代码删除 C 中单链表的所有节点。

void free_all(struct cd *head){                                                 
    struct cd *tmp;                                                                                                                                            
    tmp = head->next;                                                           
    while(tmp != NULL){                                                         
        head->next = tmp->next;                                                 
        free(tmp);                                                              
        tmp = head->next;                                                       
    }                                                                           
    free(head->next);                                                           
    free(head);                                                                 
    head=NULL;                                                                  
}          

但是,如果我在此之后打印链表的所有元素以检查列表是否为空,则始终打印“头”元素。所以看起来 head 元素没有被正确删除。怎么了?

4

1 回答 1

4

'head' 是一个函数参数,具有本地范围。因此,尽管您在函数末尾将其设置为 NULL ,但这不会产生任何影响,因为函数会立即返回,将该变量移出范围。

无论传入什么变量,仍将指向列表的头部(尽管此内存已被释放,但它可能仍包含合理的数据)。

被释放。它不一定看起来那样,因为您保留了一个指向它曾经存在的内存的指针。

要修复它,只需在调用此函数以释放列表后将指针清空即可。

free_all(actual_head);
actual_head = NULL;

您可以传入一个指向指针的指针,以便将函数中的指针设为 NULL,但这对于这种情况似乎过于复杂。

于 2012-12-07T21:51:51.200 回答