您好我正在尝试编写一个函数,该函数接收链表的头部并释放它分配的所有内存。这是我写的原始代码。
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会使指针指向某些我无法访问的内存地址吗?如果我在本地或全球范围内进行,为什么会这么重要。
提前谢谢你们。
答案 0 :(得分:2)
我可能不会这么做了
void clear_nodes(List **h) {
List * copy = *h;
while( (copy = (*h)->next) != NULL){
free(*h);
*h = NULL;
*h = copy;
}
}
递归通常比循环慢。如果你可以尝试设计没有递归例程。
答案 1 :(得分:1)
由于传递了value
h而不是location
,因此您没有更改指针 - 您正在更改指针的副本。
如果您将功能更改为
void clear_nodes(List **h) {
if ((*h)->next == NULL) {
free(*h);
*h = NULL;
}
else {
clear_nodes(&((*h)->next));
clear_nodes(h);
}
}
你可以“在本地”改变它。我认为我得到了第二部分正确...没有尝试编译/运行它。我对第一部分持肯定态度。