我试图在C中创建一个链接列表,我想知道一旦我释放它会对cursor
发生什么。
cursor
指向与head
相同的结构,所以当我释放cursor
时,它还会释放head
所指向的内容吗?
static struct node* head = NULL;
int length()
{
int counter = 0;
struct node *cursor = head;
if(cursor)
{
while((*cursor).next)
{
cursor = (*cursor).next;
counter++;
}
}
free(cursor);
return counter;
}
答案 0 :(得分:2)
正如我从您的代码中看到的,一旦删除cursor
,列表中的最后一个元素也将被删除。
可能是,您实际上不需要在free
方法中调用length
因为length
这样的方法不应该修改正在处理的数据。
我想提一下,cursor
是一个简单的指针,因此cursor
的内存在堆栈上分配,并在方法完成后自动释放。它不是在堆上分配的对象,它只是指针,所以你不应该关心任何内存释放。
另请注意在解除引用前检查cursor
是否为NULL
。
答案 1 :(得分:1)
如果两个指针具有相同的值,它们都指向同一个对象,并且一个pf指针被释放,那么另一个指针将具有无效值,因为它指向的对象尚不存在。
至于你的功能,那就错了。
无需释放指针cursor
。我认为该函数应该计算列表中的节点。在这种情况下,即使列表只包含不等于NULL的头,那么它也必须是count。
该功能可以按以下方式查看
static struct node * head = NULL;
int length()
{
int counter = 0;
for ( struct node *cursor = head; cursor != NULL; cursor = cursor->next )
{
++counter;
}
return counter;
}
答案 2 :(得分:0)
是。你释放了一个内存地址,而不是变量本身。
答案 3 :(得分:0)
一旦指针被释放,使用原始指针或该指针的副本访问其以前的元素,打印指针,复制指针等都是未定义的行为。
原始数据会消失吗?也许,也许不是 - 这是UB。
安全问题:如果指针指向敏感数据,free(pointer)
并不一定会删除对数据的访问。代码应在释放之前清除数据。其他问题也适用。