在哪里解除分配(免费)
Where to deallocate (free)
正在学习 C 语言链表教程。我已经编译了这段代码并通过 valgrind 运行 编译了它。它显示了 4 个分配和 0 个释放,据我所知。我需要知道如何正确调用 free()
来解除分配。
代码示例:llist2.c
// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* head;
void Insert(int data, int n)
{
Node* temp1 = malloc(sizeof(Node));
temp1->data = data;
temp1->next = NULL;
if(n==1) { // list is empty, set next to head, initially NULL.
temp1->next = head;
head = temp1;
return;
}
Node* temp2 = head;
for(int i = 0; i < n-2; i+=1) {
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp1;
}
void Print() {
Node* temp = head;
while(temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main (int argc, char *argv[])
{
head = NULL;
Insert(2,1);
Insert(3,2);
Insert(4,1);
Insert(5,2);
Print();
return 0;
}
您应该在使用完分配的内容后解除分配。按照列表进行释放。
比如你可以在调用Print()
后调用这个函数Deallocate()
。
void Deallocate() {
Node* temp = head;
while(temp != NULL) {
Node* next = temp->next;
free(temp);
temp = next;
}
head = NULL;
}
请注意,您不能这样做
void Deallocate_bad() {
Node* temp = head;
while(temp != NULL) {
free(temp);
temp = temp->next; /* undefined behavior */
}
head = NULL;
}
因为在解除分配 temp
后无法访问 temp->next
。
您需要创建一个函数来释放列表。
void freelist(Node* head)
{
Node *next,*curr;
curr = head;
while (curr != NULL)
{
next = curr -> next;
free(curr);
curr = next;
}
}
最后在main里调用就可以了
int main (int argc, char *argv[])
{
// Other code
freelist(head);
head = NULL;
return 0;
}
正在学习 C 语言链表教程。我已经编译了这段代码并通过 valgrind 运行 编译了它。它显示了 4 个分配和 0 个释放,据我所知。我需要知道如何正确调用 free()
来解除分配。
代码示例:llist2.c
// linked list: inserting at the n'th position
#include "stdio.h"
#include "stdlib.h"
typedef struct Node
{
int data;
struct Node* next;
} Node;
Node* head;
void Insert(int data, int n)
{
Node* temp1 = malloc(sizeof(Node));
temp1->data = data;
temp1->next = NULL;
if(n==1) { // list is empty, set next to head, initially NULL.
temp1->next = head;
head = temp1;
return;
}
Node* temp2 = head;
for(int i = 0; i < n-2; i+=1) {
temp2 = temp2->next;
}
temp1->next = temp2->next;
temp2->next = temp1;
}
void Print() {
Node* temp = head;
while(temp != NULL) {
printf("%d ", temp->data);
temp = temp->next;
}
printf("\n");
}
int main (int argc, char *argv[])
{
head = NULL;
Insert(2,1);
Insert(3,2);
Insert(4,1);
Insert(5,2);
Print();
return 0;
}
您应该在使用完分配的内容后解除分配。按照列表进行释放。
比如你可以在调用Print()
后调用这个函数Deallocate()
。
void Deallocate() {
Node* temp = head;
while(temp != NULL) {
Node* next = temp->next;
free(temp);
temp = next;
}
head = NULL;
}
请注意,您不能这样做
void Deallocate_bad() {
Node* temp = head;
while(temp != NULL) {
free(temp);
temp = temp->next; /* undefined behavior */
}
head = NULL;
}
因为在解除分配 temp
后无法访问 temp->next
。
您需要创建一个函数来释放列表。
void freelist(Node* head)
{
Node *next,*curr;
curr = head;
while (curr != NULL)
{
next = curr -> next;
free(curr);
curr = next;
}
}
最后在main里调用就可以了
int main (int argc, char *argv[])
{
// Other code
freelist(head);
head = NULL;
return 0;
}