在我附加的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
}
您可以释放main
中的分配空间 -
struct node * tmp;
while(head){
tmp = head;
head = head->next; //this is to avoid loosing reference to next memory location
free(tmp);
}
由于您通过push
中的变量地址,因此这是可能的。