在哪里解除分配(免费)

Where to deallocate (free)

正在学习 C 语言链表教程。我已经编译了这段代码并通过 valgrind 运行 编译了它。它显示了 4 个分配和 0 个释放,据我所知。我需要知道如何正确调用 free() 来解除分配。

代码示例:llist2.c

// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"

typedef struct Node
{
    int data;
    struct Node* next;
} Node;

Node* head;

void Insert(int data, int n)
{
    Node* temp1 = malloc(sizeof(Node));
    temp1->data = data;
    temp1->next = NULL;

    if(n==1) { // list is empty, set next to head, initially NULL.
        temp1->next = head;
        head = temp1;
        return;
    }

    Node* temp2 = head;
    for(int i = 0; i < n-2; i+=1) {
        temp2 = temp2->next;
    }

    temp1->next = temp2->next;
    temp2->next = temp1;
}

void Print() {
    Node* temp = head;
    while(temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }

    printf("\n");
}

int main (int argc, char *argv[])
{
    head = NULL;
    Insert(2,1);
    Insert(3,2);
    Insert(4,1);
    Insert(5,2);
    Print();

    return 0;
}   

您应该在使用完分配的内容后解除分配。按照列表进行释放。

比如你可以在调用Print()后调用这个函数Deallocate()

void Deallocate() {
    Node* temp = head;
    while(temp != NULL) {
        Node* next = temp->next;
        free(temp);
        temp = next;
    }
    head = NULL;
}

请注意,您不能这样做

void Deallocate_bad() {
    Node* temp = head;
    while(temp != NULL) {
        free(temp);
        temp = temp->next; /* undefined behavior */
    }
    head = NULL;
}

因为在解除分配 temp 后无法访问 temp->next

您需要创建一个函数来释放列表。

void freelist(Node* head)
{
    Node *next,*curr;
    curr = head;
    while (curr != NULL)
    {
       next = curr -> next;
       free(curr);
       curr = next;
    }
}

最后在main里调用就可以了

int main (int argc, char *argv[])
{
    // Other code

    freelist(head);
    head = NULL;
    return 0;
}