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

时间:2015-12-04 22:20:49

标签: c pointers malloc free

我试图在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;
}

4 个答案:

答案 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)并不一定会删除对数据的访问。代码应在释放之前清除数据。其他问题也适用。