这是由比C更好的C编程人员完成的。
对C
中free()的使用感到困惑下面是链表的结构
typedef struct node {
int value;
struct node *next;
} ListNode;
typedef struct list {
ListNode *head;
} LinkedList;
创建包含某些节点的列表后
他的代码在退出时执行此操作
void deleteList(LinkedList *ll) {
if (ll != NULL) {
ListNode *temp;
while (ll->head) {
temp = ll->head;
ll->head = temp->next;
free(temp);
}
free(ll);
}
}
以上是我不明白的。为什么他需要创造这样的复杂性,为什么不做自由(ll)。 请帮忙
提前感谢。
答案 0 :(得分:3)
链接列表由碰巧指向彼此的单个对象组成。如果要删除列表,则必须删除其所有节点。 free()
不会这样做。它不知道这些对象构成一个列表。它甚至不知道这些对象包含指向任何东西的指针。因此,您需要手动迭代列表和free
每个节点。
答案 1 :(得分:3)
如果你有一个链表,那么每个“*”都是一个节点。
0 1 2 3 4
head--> *--*--*--*--*
第一个*,头部,你只是做“免费ll” 这将在记忆中
0 1 2 3 4
head-->nul *--*--*--*
这里的问题是,你要求这些节点的所有“内存”仍然存在,现在你不知道你需要的每个malloc它在哪里(你没有任何东西对那个内存有任何影响)免费(不是100%正确,但对于简单的工作)。
该算法的作用是:
答案 2 :(得分:1)
您可以单独使用以下结构
typedef struct node {
int value;
struct node *next;
} ListNode;
但每次你必须声明一个全局变量struct node *HEAD
。在更大的计划中,它可能会让您感到困惑。作者已完成此操作,以便您可以创建类似变量的链接列表。每次你必须创建一个新的链表时,你所要做的就是声明
LinkedList *ll;
当有两个结构时,必须释放struct
的对象。
答案 3 :(得分:0)
那是因为每个指针都指向一个内存位置。您需要释放先前分配的所有内存位置。 free(ll)
只会删除ll
指针指向的节点。