我该如何释放在另一个函数中分配的节点?
struct node {
int data;
struct node* next;
};
struct node* buildList()
{
struct node* head = NULL;
struct node* second = NULL;
struct node* third = NULL;
head = malloc(sizeof(struct node));
second = malloc(sizeof(struct node));
third = malloc(sizeof(struct node));
head->data = 1;
head->next = second;
second->data = 2;
second->next = third;
third->data = 3;
third->next = NULL;
return head;
}
我在main()函数中调用了buildList函数。
int main()
{
struct node* h = buildList();
printf("The second element is %d\n", h->next->data);
return 0;
}
我想要释放头部、第二个和第三个变量。
谢谢。
更新:
int main()
{
struct node* h = buildList();
printf("The element is %d\n", h->next->data); //prints 2
//free(h->next->next);
//free(h->next);
free(h);
// struct node* h1 = buildList();
printf("The element is %d\n", h->next->data); //print 2 ?? why?
return 0;
}
两行代码都打印2。调用free(h)不应该删除h吗?如果是这样,为什么h->next->data仍然可以使用,如果h已经被释放了呢?当然,“second”节点没有被释放。但是既然头部已经被删除了,就应该能够引用下一个元素。这里出了什么问题?
malloc()
返回的值来调用free()
。 - vhallacfree()
函数并不会擦除内存的内容,它只是允许这些内容稍后被重用。指针h->next
之所以仍然有效是因为你free()
的那块内存尚未被重用,这只是巧合。 - Heath Hunnicutth->next->data
可能会导致分段错误。好的,假设你有一个包含以下数据的h
:h->next = 0x12341281; h->data = 1
,当你执行free(h)
时,你只是让机器知道在未来的malloc
中可以覆盖h
,即h
不再被程序使用。但是数据h->next = 0x12341281; h->data = 1
似乎仍然存在,这并不意味着你应该使用它们。 - insumitymalloc
中,会保存h->next
和h->data
之外的其他内容。那么当执行h->next->data
时,可能会导致分段错误。 - insumity