【问题标题】:Free() after using malloc in linked list在链表中使用 malloc 后的 Free()
【发布时间】:2020-12-10 13:44:15
【问题描述】:

我知道每次我使用 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之外释放,在所有与列表相关的任务完成后。最好将列表头传递给一个专用函数,该函数反过来会释放资源

标签: c linked-list dynamic-memory-allocation free


【解决方案1】:

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

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;

【讨论】:

  • 谢谢.. 你能解释一下为什么在你的函数中我可以声明“node *tmp = head”但我不能在“tmp = head”之后声明“node *tmp”或"*tmp = 头"
【解决方案2】:

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

你可以在 printlist() 之后释放你的内存...

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 2014-05-05
    • 1970-01-01
    • 2023-04-07
    • 2011-06-06
    • 2015-05-28
    • 2021-05-24
    相关资源
    最近更新 更多