假设我有一个标准链表结构如下:
struct Linked {
int data;
Linked* next;
}
我在一个循环中通过calloc
使next
指针有足够的内存来存储另一个Linked
并初始化它。根据链表的规范,我只维护指向第一个节点的指针,如下所示:
struct Linked *first = make_list();
现在,我想要释放整个链表所占用的内存。我可以打电话给
吗?free(first);
并让它释放所有内存(包括分配给所有next
指针的内存),或者我必须从末尾向后执行释放?
每次调用calloc()
必须调用一次free()
。因此,您需要使用循环来依次释放列表中的每个元素。您可以选择向后或向前释放,但您可能会发现向前更容易:
void freelist(struct Linked *head)
{
while (head != NULL) {
struct Linked *tmp = head;
head = head->next;
free(tmp);
}
}
注意(这很重要),在释放节点之前,必须读取head->next
的值。