如何在循环内释放数据 malloc()?
How to free data malloc()'d inside a loop?
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void reverse_print_list(Node *head)
{
if(head == NULL)
return;
print_list(head->next);
printf("%d ", head->data);
}
int main()
{
Node *head = malloc(sizeof(Node));
head->data = rand() % 100;
head->next = NULL;
Node *temp = head;
for (int i = 0; i < 9; i++) {
Node* new_node = malloc(sizeof(Node));
new_node->data = rand() % 100;
new_node->next = NULL;
temp->next = new_node;
temp = temp->next;
}
temp = head;
printf("Original list : \n");
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n---------------------------\n");
reverse_print_list(head);
free(head);
free(temp);
return 0;
}
在上面的代码中,在 main() 的 for 循环内,我为链表的新节点动态分配内存,并将每个新创建的节点附加到列表中的最后一个节点。但这似乎会导致内存泄漏,因为我没有在循环结束时释放这些节点,因为我需要这些节点存在于循环之外。如何释放我在 for 循环中创建的节点? 运行 另一个循环从 head
开始保存所有节点的地址,然后 运行 另一个循环手动释放()所有这些地址似乎很乏味。还有别的办法吗?谢谢
只需删除头节点并将head
替换为其后继节点。重复直到 head
变为空。请注意,您必须在调用 free() 之前备份 next
指针。
int main()
{
Node *head = malloc(sizeof(Node));
head->data = rand() % 100;
head->next = NULL;
... build and print your list ...
while (head)
{
Node * remainingChain = head->next;
free(head);
head = remainingChain;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
void reverse_print_list(Node *head)
{
if(head == NULL)
return;
print_list(head->next);
printf("%d ", head->data);
}
int main()
{
Node *head = malloc(sizeof(Node));
head->data = rand() % 100;
head->next = NULL;
Node *temp = head;
for (int i = 0; i < 9; i++) {
Node* new_node = malloc(sizeof(Node));
new_node->data = rand() % 100;
new_node->next = NULL;
temp->next = new_node;
temp = temp->next;
}
temp = head;
printf("Original list : \n");
while (temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n---------------------------\n");
reverse_print_list(head);
free(head);
free(temp);
return 0;
}
在上面的代码中,在 main() 的 for 循环内,我为链表的新节点动态分配内存,并将每个新创建的节点附加到列表中的最后一个节点。但这似乎会导致内存泄漏,因为我没有在循环结束时释放这些节点,因为我需要这些节点存在于循环之外。如何释放我在 for 循环中创建的节点? 运行 另一个循环从 head
开始保存所有节点的地址,然后 运行 另一个循环手动释放()所有这些地址似乎很乏味。还有别的办法吗?谢谢
只需删除头节点并将head
替换为其后继节点。重复直到 head
变为空。请注意,您必须在调用 free() 之前备份 next
指针。
int main()
{
Node *head = malloc(sizeof(Node));
head->data = rand() % 100;
head->next = NULL;
... build and print your list ...
while (head)
{
Node * remainingChain = head->next;
free(head);
head = remainingChain;
}
return 0;
}