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

Koz*_*oss 1 c free struct linked-list

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

struct Linked {
    int data;
    Linked* next;
}
Run Code Online (Sandbox Code Playgroud)

我通过指针足够的内存来存储另一个并初始化它,calloc从而在循环中制作了一堆它们.根据链表的规范,我只维护一个指向第一个节点的指针,如下所示:nextLinked

struct Linked *first = make_list();
Run Code Online (Sandbox Code Playgroud)

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

free(first);
Run Code Online (Sandbox Code Playgroud)

让它释放所有内存(包括分配给所有next指针的内存),还是我必须从后端重新分配?

Gre*_*ill 7

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

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

注意(这很重要)您必须head->next 释放节点之前读取其值.