释放指向其他结构的结构中的指针

时间:2015-08-16 05:08:15

标签: c pointers struct

让我们说我有一些数据结构,其中结构有指向其他结构的指针,例如链表。列表中的每个元素都有一个指向列表中另一个元素的指针

struct node{
  char* data;
  node* next;
};

当释放分配给这个结构的内存时,我知道我需要首先专门释放数据,因为我必须专门为它分配内存。但接下来呢?它指向另一个节点,我相信释放它会释放下一个指向的实际节点。

清理时是否足以释放整个节点,或者是否有任何方法可以释放指针而不释放它指向的结构?

2 个答案:

答案 0 :(得分:4)

这取决于你如何在内存中构建结构。任何malloc都必须与free保持平衡。一旦指向next节点被释放,它就不再有效。

// create root
node* n1 = calloc(1, sizeof(node));

// create/link another node
n1->next = calloc(1, sizeof(node));

// destroy/unlink 2nd node
free(n1->next);
n1->next = NULL;

// destroy 1st node
free(n1);

答案 1 :(得分:3)

没有像释放指针这样的东西,你只能释放内存一个指针指向 - 所以如果你想删除一个链表的单个元素,您必须更新上一项的next指针,以便在删除之前指向要删除的元素的next(可能是NULL)。

void deleteNode(struct node **list, struct node *element)
{
    /* first node? */
    if (element == *list)
    {
        *list = element->next;
        free(element->data);
        free(element);
        /* now list points to the second element, if any */
    }
    else
    {
        /* find previous node */
        struct node *p = *list;
        while (p->next != element) p = p->next;

        /* adjust next pointer */
        p->next = element->next;
        free(element->data);
        free(element);
    }
}

请注意,使用单链接列表不适用于具有随机删除的大型列表,因为您必须每次从头开始搜索列表。

为了删除整个链接列表,有一个迭代和递归方法,但我没有在这里显示代码,因为我理解你的问题,这不是你想要做的。 / p>