如何在循环内释放数据 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;
}