gpt4 book ai didi

c - 如何正确释放链表的所有元素?

转载 作者:行者123 更新时间:2023-12-04 08:40:27 24 4
gpt4 key购买 nike

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

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

最佳答案

你的想法是对的,但实现是错误的。在您的循环中,您正在释放 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;
}

关于c - 如何正确释放链表的所有元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64595706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com