free()到全局链表C

时间:2018-08-10 15:59:31

标签: c linked-list global free

我的程序中有一些全局链接列表,还有一个“通用”函数,该函数获取指向头的指针并释放所有节点:

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

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

2 个答案:

答案 0 :(得分:2)

假设最后一个节点指向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); 
             }
         }

答案 1 :(得分:2)

释放指针后是否值得将指针设置为NULL是否值得商bat。因为无论如何在释放列表之后您都不应该触摸head指针,并且head指向“旧值”没有任何问题-释放后使用它是不确定的行为。

抛开这些,如果您想通过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中的所有内容都被值传递了。这就是为什么只有headfreelist的本地副本变为NULL而不是您传递给它的副本的原因。