C 何时释放链表中的节点

C 何时释放链表中的节点,c,linked-list,free,C,Linked List,Free,当我在curr->data中输入数据时,我首先通过执行curr=(NODE*)malloc(sizeof(NODE))分配内存。然后我建立列表,最后打印出来。在程序的某个地方,我必须释放我使用过的内存,但我不知道什么时候做。在建立列表之后,还是在我打印列表之后?或者我可以这样做吗 printf("How many elements do you want to make? "); scanf("%d", &NumElem); head = NULL; for (i = 0; i <

当我在
curr->data
中输入数据时,我首先通过执行
curr=(NODE*)malloc(sizeof(NODE))分配内存。然后我建立列表,最后打印出来。在程序的某个地方,我必须释放我使用过的内存,但我不知道什么时候做。在建立列表之后,还是在我打印列表之后?或者我可以这样做吗

printf("How many elements do you want to make? ");
scanf("%d", &NumElem);
head = NULL;
for (i = 0; i < NumElem; i++)
{
    //memory allocate
    curr = (NODE*)malloc(sizeof(NODE));
    printf("Number %d: ", i+1);
    scanf("%d", &curr->num);
    FLUSH;

    if (head == NULL)/*beginning of the list*/
    {
        curr->next = head;
        head = curr;
        *tail = curr;
    }
    else /*adding on the list*/
    {
        curr->next = head;
        head = curr;
    }
    free (curr);
}//for 
printf(“您要制作多少个元素?”);
scanf(“%d”&NumElem);
head=NULL;
对于(i=0;inum);
脸红
如果(head==NULL)/*列表的开头*/
{
当前->下一步=头部;
水头=电流;
*尾=电流;
}
else/*添加到列表中*/
{
当前->下一步=头部;
水头=电流;
}
免费(货币);
}//为了

每次将数据放入当前节点后,是否可以释放数据?

假设您预订了一个本地会议室,计划在该会议室举行会议,然后是一个聚会。您什么时候可以取消预订。。。在你预定之后,在你开完会但在你开派对之前,还是在你开完会和派对之后

malloc
free
都是这样的
malloc
保留一个内存区域供您使用,
free
取消保留。如果在取消预订后继续使用内存,则行为未定义

在您的情况下,需要释放整个节点列表。可以在循环中执行此操作,但有一个常见的陷阱:在访问节点的
next
指针之前释放节点。危险的是,这在实践中几乎总是有效的,但它是未定义的,有时甚至不起作用。。。可能在一些控制生命关键机械的软件中。最好现在就开始学习:

void free_list(NODE* list)
{
    while (list)
    {
        NODE* next = list->next;
        free(list);
        list = next;
    }
}
或者以稍微紧凑的形式

void free_list(NODE* list)
{
    for (NODE* next; list; list = next)
    {
        next = list->next;
        free(list);
    }
}

如果您的节点包含指向字符串或其他对象的指针,这些字符串或对象是
malloc
ed并且需要释放的,那么在释放节点本身之前,这些自由调用将在free_列表中完成。

假设您预订了一个本地会议室,您计划在那里举行会议,然后举行聚会。您什么时候可以取消预订。。。在你预定之后,在你开完会但在你开派对之前,还是在你开完会和派对之后

malloc
free
都是这样的
malloc
保留一个内存区域供您使用,
free
取消保留。如果在取消预订后继续使用内存,则行为未定义

在您的情况下,需要释放整个节点列表。可以在循环中执行此操作,但有一个常见的陷阱:在访问节点的
next
指针之前释放节点。危险的是,这在实践中几乎总是有效的,但它是未定义的,有时甚至不起作用。。。可能在一些控制生命关键机械的软件中。最好现在就开始学习:

void free_list(NODE* list)
{
    while (list)
    {
        NODE* next = list->next;
        free(list);
        list = next;
    }
}
或者以稍微紧凑的形式

void free_list(NODE* list)
{
    for (NODE* next; list; list = next)
    {
        next = list->next;
        free(list);
    }
}

如果您的节点包含指向字符串或其他对象的指针,这些字符串或对象是
malloc
ed并且需要释放的,那么在释放节点本身之前,这些自由调用将在free_列表中完成。

当您使用完节点后。在这种情况下,您没有使用它-即使您已经完成了循环。如果您
free
它则
tail
head
(例如)现在指向垃圾,因为对象已
free
d。一旦释放内存,您就不能再次引用它,因为内容将未定义。在你完成了你需要的列表后(我想是打印出来的),然后遍历列表,一路上释放每个节点?使用完毕后。在这种情况下,您没有使用它-即使您已经完成了循环。如果您
free
它则
tail
head
(例如)现在指向垃圾,因为对象已
free
d。一旦释放内存,您就不能再次引用它,因为内容将未定义。在你完成了你需要的列表后(我想是打印出来的),然后遍历列表,一路上释放每个节点