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。一旦释放内存,您就不能再次引用它,因为内容将未定义。在你完成了你需要的列表后(我想是打印出来的),然后遍历列表,一路上释放每个节点代码>?