这个C递归结构会正确解除分配吗?

时间:2014-07-15 00:38:13

标签: c struct linked-list free

假设我有一个标准的链表结构如下:

struct Linked {
    int data;
    Linked* next;
}

我通过calloc next指针在一个循环中创建了一堆足够的内存来存储另一个Linked并初始化它。根据链表的规范,我只维护一个指向第一个节点的指针,如下所示:

struct Linked *first = make_list();

现在,我想释放整个列表所占用的内存。我可以打电话吗

free(first);

并让它释放所有内存(包括分配给所有next指针的内存),或者我是否必须从最后向后执行释放?

1 个答案:

答案 0 :(得分:7)

每次拨打free()时,都必须拨打calloc()一个电话。因此,您需要使用循环依次释放列表中的每个元素。您可以选择向后或向前进行释放,但您可能会发现前锋更容易:

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

注意(这很重要)您必须在释放节点之前阅读head->next 的值。