【问题标题】:Will this C recursive struct deallocate properly?这个 C 递归结构会正确释放吗?
【发布时间】:2014-07-15 00:38:12
【问题描述】:

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

struct Linked {
    int data;
    Linked* next;
}

我通过calloc 使next 指针有足够的内存来存储另一个Linked 并对其进行初始化,从而使它们循环起来。按照链表的规范,我只维护一个指向第一个节点的指针,如下所示:

struct Linked *first = make_list();

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

free(first);

并让它释放所有内存(包括分配给所有next 指针的内存),还是我必须从末尾向后进行释放?

【问题讨论】:

    标签: c struct linked-list free


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 2018-01-17
      • 2021-08-02
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2023-03-10
      相关资源
      最近更新 更多