【问题标题】:How to correctly free all elements of a linked list?如何正确释放链表的所有元素?
【发布时间】:2021-02-12 04:01:48
【问题描述】:

我有一个类似于链表的结构表。我的目标是清空该表中的所有内容。我认为我的想法是正确的,但它不起作用,我不知道为什么。

typedef struct table{
    LIST *top;
    int size;
}TABLE;

我正在尝试的是获取表格中的每一件事并将free() 应用于它。然后将表的顶部设置为NULL,这样我以后就无法通过它并将大小设置为0。

void empty_table(TABLE *table) {
    LIST *cur;
    for (cur = table->top; cur != NULL; cur = cur->next) {
        if (cur == NULL) return;
        free(cur);
    }
    table->top = NULL;
    table->size = 0;
}

显然这不起作用,我不知道原因。我尝试了一个简单的运行,它甚至没有改变大小。

    // ...
    printf("table has %d elements\n",tab->size);
    empty_table(tab);
    printf("table has %d elements\n",tab->size);
    // ...

我在这里测试tab 是指向表的指针。

输出是:

table has 5 elements
table has 5 elements

【问题讨论】:

    标签: c memory struct free


    【解决方案1】:

    你的想法是对的,但实施是错误的。在您的循环中,您正在释放cur,然后然后查看它的->next。这是未定义的行为,因为 cur 刚刚被释放。

    如果你想释放整个列表,你必须保留另一个临时指针来记住cur,并且只有在你前进到列表中的下一个元素后才释放它。您将无法使用for 循环执行此操作,因为cur = cur->next 操作不能是最后一个操作,但必须在free() 之前完成。

    这是一个例子:

    void empty_table(TABLE *table) {
        LIST *cur = table->top;
        LIST *tmp;
    
        while (cur != NULL) {
           tmp = cur;
           cur = cur->next;
           free(tmp);
        }
    
        table->top = NULL;
        table->size = 0;
    }
    

    【讨论】:

    • 没看到,谢谢你的回答。我会改的。
    猜你喜欢
    • 2022-12-04
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    相关资源
    最近更新 更多