如何在C中释放链接列表?

时间:2013-10-27 19:04:55

标签: c linked-list free nodes dynamic-memory-allocation

在C语言中,我有类似的东西:

typedef struct bucket {
int value;
struct bucket *next;
} Bucket;

typedef struct table {
int size;
Bucket **buckets;
} Table;

现在我做Table *t = malloc(sizeof(Table));

t->buckets = calloc(10, sizeof(Bucket));

解放表* t为free(t);正确的吗?

现在,我如何能够释放存储桶链表和每个节点?

2 个答案:

答案 0 :(得分:1)

对于每个free / malloc,您应该以对称的方式对calloc进行相应的调用:

Table *t = malloc(sizeof(Table));
t->buckets = calloc(10, sizeof(Bucket));
...
free(t->buckets);
free(t);

如果你错过了释放t->buckets,你将会泄漏内存,因为Table结构只包含指向存储桶的指针而不包含它们。编译器也不会为你插入它。

答案 1 :(得分:0)

另一个可能出错的事情是释放节点然后尝试访问下一个节点,因此您需要先保存下一个指针。

Bucket *bptr, *next;

bptr = *t;
while (bptr) {
    next = bptr->next;
    free(bptr);
    bptr = next;
} 
free(t);
t=NULL;