如果我复制一个指针然后释放它,原始数据会消失吗?

If I copy a pointer and then free it, does the original data disappear?

我正在尝试用 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;
}

正如我从您的代码中看到的,一旦您删除 cursor,列表中的最后一个元素也将被删除。 可能是,您实际上不需要在 length 方法中调用 free,因为 length 等方法不应修改正在处理的数据。 我想提一下,cursor 是一个简单的指针,所以 cursor 的内存是在堆栈上分配的,并在方法完成后自动释放。它不是在堆上分配的对象,它只是指针,所以你不应该关心任何内存释放。 还要注意在取消引用之前检查 cursor 不是 NULL

如果两个指针具有相同的值,即它们都指向同一个对象,并且其中一个指针已被释放,则另一个指针将具有无效值,因为它指向的对象尚不存在。

至于你的功能那就错了

不需要释放指针cursor。我认为该函数应该计算列表中的节点。在这种情况下,即使列表只包含不等于 NULL 的头部,它也必须被计数。

函数可以如下所示

静态结构节点* head = NULL;

int length()
{
    int counter = 0;

    for ( struct node *cursor = head; cursor != NULL; cursor = cursor->next )
    {
        ++counter;
    }

    return counter;
}

是的。您释放一个内存地址,而不是变量本身。

一旦指针被释放,使用原始指针或该指针的副本访问其以前的元素、打印指针、复制指针等都是未定义的行为。

原始数据会消失吗?也许,也许不是——是UB。

安全问题:如果指针指向敏感数据,free(pointer) 不一定会消除对数据的访问。代码应该在释放之前清理数据。其他问题也适用。