free() 到全局链表 C

free() to global linked list C

我的程序中有一些全局链表,还有一个 "generic" 函数获取指向头的指针,并释放所有节点:

void freelist(list* head) { 
    list* tmp;
    while (head != NULL) {
        tmp  = head;
        head = head->next;
        free(tmp);
    }
}

函数运行良好,最后是指向列表(头)的本地指针, 变成了NULL。但是列表的全局指针没有更改为 NULL,仍然指向 "empty" 列表的开头(不是我的值,释放后的值)。

假设你的最后一个节点指向 NULL 并且你需要在 freekist 中使用双指针来使你的全局指针为 NULL。

换句话说,如果您想将全局头更改为 NULL,请将 globalHead 的地址提供给自由列表函数,为此您需要双指针。

您可以像下面这样调用 freelist。

freelist(&globalHead);

你的空闲列表定义如下。

void freelist(list **head)
         { 
              list* tmp; 
              if(head ==NULL)
              return;

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

释放后尝试将指针设置为 NULL 是否值得值得商榷。因为你不应该在释放列表后触摸 head 指针并且 head 指向 "old value" 没有任何问题 - 在释放后使用它是未定义的行为。

撇开这一点不谈,如果您确实想通过 free'ing 函数将其设置为 NULL,则必须将指针传递给 head,如:

void freelist(list **head)
{ 
    list* tmp, *p = *head;
    while(p != NULL){
        tmp = head;
        p = p->next;
        free(tmp);
    }
    *head = NULL;
}

并将其命名为:

freelist(&head); // Assuming 'head' is of type 'list *'.

这是因为 C 中的所有内容都是按值传递的。这就是为什么只有 freelist 中的 head 的本地副本变为 NULL 而不是您传递给它的副本。