在链表中使用 malloc 后的 Free()

Free() after using malloc in linked list

我知道每次我使用 malloc 或 calloc 我也必须释放内存,但在这种特定情况下我无法理解何时释放内存以及如何释放内存 generate()功能代码不再有效。

void generate(int n){
     node *tmp,*new;
     int num,i;
     head = malloc(sizeof(node));
     if (head==NULL){
         perror("malloc");
         EXIT_FAILURE;
     }
     num = rand() % (42 - (-42) + 1) - 42;
     head->data = num;
     head->next = NULL;
     tmp = head;

     for(i=1;i<n;i++){
         new = malloc(sizeof(node));
         if(new == NULL){
            perror("malloc");
            EXIT_FAILURE;
         }
         num = rand() % (42 - (-42) + 1) - 42;
         new->data = num;
         new->next = NULL;
         tmp->next = new;
         tmp = tmp->next;
     }
}

int main(){
    int n;
    do {
        printf("give me the size of the linked list (less than 42):");
        scanf("%d",&n);
        if(n>42){
          printf("i said less than 42. \n Please ");
        }
     } while(n>41);

     srand(time(NULL));
     generate(n);
     printlist();
     return 0;
}

如果您在 generate() 函数内部释放,当您的程序到达 printlist() 函数时,内存将被释放(因此您的程序将无法运行)。

您可以在 printlist() 后释放内存...

    generate(n);
    printlist();
    
    /*
    FREE MEMORY
    */
    return 0;

但这没有意义,因为当您的程序以 return 0 结束时,操作系统会自动释放内存。

但是,如果您要在 printlist() 之后添加更多代码,您仍然应该释放内存。

链表删除使用单独的函数如下:

void deleteList()
{
    node *tmp = head;
    while(tmp != NULL)
    {
        tmp = tmp -> next;
        free(head);
        head = tmp;
    }
    head = tmp;
}

使用上述函数释放分配给链表的内存

generate(n);
printlist();

// FREE MEMORY
// function call
deleteList();
return 0;