在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)
;正确的吗?
现在,我如何能够释放存储桶链表和每个节点?
答案 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;