您好,我正在尝试编写一个函数,该函数接受链表的头部并释放它分配的所有内存。这是我写的原始代码。
void clear_nodes(List *h) {
if (!h->next) {
free(h);
***h = NULL;***
}
else {
clear_nodes(h->next);
clear_nodes(h);
}
}
但是它不起作用。所以我改成了
void clear_nodes(List *h) {
if (!h->next) {
free(h);
}
else {
clear_nodes(h->next);
***h->next = NULL;***
clear_nodes(h);
}
}
现在成功了。 请注意两者之间的区别,我只是想知道为什么我不能直接将指针指向 null 。是因为它是局部变量还是什么?但是将指针标记为 null 应该使指针指向一些我无法访问的内存地址,对吗?我在本地或全局范围内进行操作有何重要意义。
提前谢谢你们。
最佳答案
我可能会非递归地这样做
void clear_nodes(List **h) {
List * copy = *h;
while( (copy = (*h)->next) != NULL){
free(*h);
*h = NULL;
*h = copy;
}
}
递归通常比循环慢。如果您可以尝试在没有递归例程的情况下进行设计。
关于c - 在 C 中释放链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21637430/