Hom*_*ith 2 c pointers linked-list
我在一本书中找到了这段代码:
void DeleteList(element *head)
{
element *next, *deleteMe;
deleteMe = head;
while (deleteMe) {
next = deleteMe->next;
free(deleteMe);
deleteMe = next;
}
}
Run Code Online (Sandbox Code Playgroud)
假设我们传递给函数的参数是指向列表头部的指针,为什么我们不传递对该指针的引用?
如果我们不这样做,我们不是要删除该指针的本地副本吗?这就是我们传递参考指针的原因吗?那么被调用者获得了在函数内部所做的更改?
如果我们不这样做,我们不是要删除该指针的本地副本吗?
好吧,在C中没有引用这样的东西,但我认为你的意思是指向指针,答案是否定的.
您正在释放指针指向堆上的内存,而不是指针本身.你没有改变指针,所以复制很好.无论是否是副本,它们都指向同一个地方.
你很困惑,为传递给函数的变量赋一个全新的值,在这种情况下你需要一个指向指针的指针.例如:
// only changes the local copy
void init(some_type *foo) {
foo = malloc(sizeof(some_type));
}
// initializes the value at *foo for the caller to see
void init(some_type **foo) {
*foo = malloc(sizeof(some_type));
}
Run Code Online (Sandbox Code Playgroud)
将指针传递给指针(不是对指针的引用,因为C根本没有引用)将是一个更好的解决方案,因为您可以在删除后将其清空.正如它当前定义的那样,如果调用者不小心,该函数可能会留下悬空指针.除了这个小问题,这个解决方案是有效的:调用者总是NULL可以在传递给列表头之后手动分配给列表头DeleteList().
这是我如何使用指针指针重写它:
void DeleteList(element **head) {
element *next, *deleteMe;
deleteMe = *head;
while (deleteMe) {
next = deleteMe->next;
free(deleteMe);
deleteMe = next;
}
*head = NULL;
}
Run Code Online (Sandbox Code Playgroud)