在链接列表中使用malloc之后的Free

问题描述

我知道每次我使用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;
}

解决方法

使用单独的功能删除链表,如下所示:

$(Build.BuildNumber)

使用上述功能释放分配给链表的内存

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

如果您在generate()函数中释放了内存,则当程序进入printlist()函数时,内存将被释放(因此程序将无法运行)。

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

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

但是没有意义,因为当程序以return 0结尾时,操作系统将自动释放内存。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...