如何释放由另一个函数的一个函数动态分配的内存?

时间:2016-12-04 15:54:39

标签: c memory-management linked-list

在我附加的C程序中,我已经定义了一个名为push()的单独函数,用于将节点添加到链接列表的前面。 push()为堆上的node分配内存,但是我无法释放内存,因为push()完成的工作不会反映在调用者(main())中。那么如何从main()内部释放相关的堆分配内存?

感谢任何形式的帮助。提前谢谢。

#include <stdio.h>
#include <stdlib.h>

struct node
{
    int data;
    struct node *next;
};

/* Prototypes */
void push(struct node **headRef, int data);

int main(void)
{
    struct node *head, *tail, *current;
    int i;

    head = NULL;

    // Deal with the head node here, and set the tail pointer
    push(&head, 1);
    tail = head;        // tail and head now point to the same thing

    // Do all the other nodes using TAIL
    for (i = 2; i < 6; i++)
    {
        push(&(tail->next), i);     // add node at tail->next
        tail = tail->next;          // advance tail to point to last node
    }

    current = head;
    while (current)
    {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");

    return 0;
}

/*
 Takes a list and a data value.
 Creates a new link with the given data and pushes
 it onto the front of the list.
 The list is not passed in by its head pointer.
 Instead the list is passed in as a "reference" pointer
 to the head pointer -- this allows us
 to modify the caller's memory.
*/
void push(struct node **headRef, int data)
{
    struct node *newNode = malloc(sizeof(struct node));
    newNode->data = data;
    newNode->next = *headRef;   // The '*' to dereference back to the real head
    *headRef = newNode;         // ditto
}

1 个答案:

答案 0 :(得分:1)

您可以像{ - 1}}一样释放分配的空间 -

main

因为您在struct node * tmp; while(head){ tmp = head; head = head->next; //this is to avoid loosing reference to next memory location free(tmp); } 中传递变量的地址,所以这是可能的。