我有一个结构表,它有点像链表。我的目标是清空那张桌子上的所有东西。我认为我的想法是正确的,但它不起作用,我不知道为什么。
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 elementsn",tab->size);
empty_table(tab);
printf("table has %d elementsn",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;
}