在C语言中释放结构内存

在C语言中释放结构内存,c,memory-leaks,C,Memory Leaks,我有以下创建链表的结构,如何释放分配的内存 typedef struct linked_list { struct linkedl_ist *number; POINTER house; } list; typedef list *LIST; typedef void pointer 我有以下清单 LIST l1; l1 = some_function(pointer); 这些l1是使用一些变量构建的。正如我提到的,这是一个链表数据结构。如何释

我有以下创建链表的结构,如何释放分配的内存

typedef struct linked_list {
    struct linkedl_ist *number;
    POINTER           house;
} list;


typedef  list  *LIST;  
typedef void pointer
我有以下清单

LIST l1;
l1 = some_function(pointer);
这些
l1
是使用一些变量构建的。正如我提到的,这是一个链表数据结构。如何释放为
l1
分配的内存

[编辑]


l1
拥有8字节的内存。

您必须单独释放内存指针。这里没有什么灵丹妙药,你必须在链表上循环并释放每个节点的指针,然后如果链表本身是动态分配的,你必须释放它


以正确的顺序释放物品是很重要的,这样你就不会以失败告终。换句话说,如果您有指向另一个指针p2的指针p,则需要确保释放p2,然后释放p。您不希望在释放p2之前释放p,因为当您尝试释放p2时,您将通过一个悬空指针来执行此操作(例如,释放(p->p2),但p已被释放)。

您必须单独释放内存指针。这里没有什么灵丹妙药,你必须在链表上循环并释放每个节点的指针,然后如果链表本身是动态分配的,你必须释放它


以正确的顺序释放物品是很重要的,这样你就不会以失败告终。换句话说,如果您有指向另一个指针p2的指针p,则需要确保释放p2,然后释放p。您不希望在释放p2之前释放p,因为当您尝试释放p2时,您将通过一个悬空指针来执行此操作(例如,释放(p->p2),但p已被释放)。

l1
不需要被释放。它在书堆上。从您所在的函数返回,它将自动消失。释放
l1
指向的内容的方法与释放列表中其余元素的方法相同:遍历列表(使用
->number
)并在执行过程中释放每个元素

LIST node = l1;
LIST next;
while (node != NULL)
{
    next = node->number;
    free(node);
    node = next;
}

l1
不需要释放。它在书堆上。从您所在的函数返回,它将自动消失。释放
l1
指向的内容的方法与释放列表中其余元素的方法相同:遍历列表(使用
->number
)并在执行过程中释放每个元素

LIST node = l1;
LIST next;
while (node != NULL)
{
    next = node->number;
    free(node);
    node = next;
}

我认为你应该手动释放列表中的每个元素,从l1开始,然后l1->数字等等。

我认为你应该手动释放列表中的每个元素,从l1开始,然后l1->数字等等。

这取决于它是如何分配的。这取决于它是如何分配的。如果你这样做,你必须非常非常小心。如果您释放了
l1
,然后尝试访问
l1->number
,则您正在触摸已释放的内存。这是一个很大的禁忌。如果你想这样做,你需要确保在你真正释放元素之前,你把所有你需要的数据拉到本地。没错。事实上,我也在做这些工作,但我还有很多工作要做(正如你所看到的):)我在这些方面没有太多经验。你能给我一些有用的链接,或者一些与之相关的例子吗?试试这里:例如,一个例子,或者一本手册。如果你这样做,你必须非常非常小心。如果您释放了
l1
,然后尝试访问
l1->number
,则您正在触摸已释放的内存。这是一个很大的禁忌。如果你想这样做,你需要确保在你真正释放元素之前,你把所有你需要的数据拉到本地。没错。事实上,我也在做这些工作,但我还有很多工作要做(正如你所看到的):)我在这些方面没有太多经验。你能给我一些有用的链接,或者一些与之相关的例子吗?试试这里:例如,或者手册。注意,
l1
是一个
列表*
。因此,虽然指针变量本身不需要被释放,但您需要释放它所指向的
列表。@Matthew:Whoops,错过了typedef中的*。谢谢。请注意,
l1
是一个
列表*
。因此,虽然指针变量本身不需要被释放,但您需要释放它所指向的
列表。@Matthew:Whoops,错过了typedef中的*。谢谢