我正在使用列表进行训练,从某个时候开始我想知道 free() 函数究竟是如何工作的。我认为这将清除 struct first_node 中的数据和 next_node 值(查看代码),但只有数据值被销毁,而 next_node 仍然指向我列表中的下一个位置。为什么?
struct Data
{
int a;
int b;
};
struct Node
{
struct Data* data;
struct Node* next_node;
};
struct List
{
struct Node* first_node;
};
void init(struct List* list)
{
list->first_node = NULL;
}
…
struct Data* remove_first_element_from_list(struct List* list)
{
if (list->first_node == NULL)
{
printf("The list is empty!\n");
return 0;
}
struct Data *pointer;
pointer = list->first_node->data;
free(list->first_node);
list->first_node = list->first_node->next_node;
return pointer;
}
感谢任何解释。
最佳答案
当你这样做时你有未定义的行为
list->first_node = list->first_node->next_node
UB 是因为 list->first_node
不再指向分配的内存。
但是,没有说明当您调用 free
时必须清除或以其他方式修改数据。它所做的只是告诉操作系统内存再次可供某人分配。这就是为什么您仍然可以使用指针的原因,这就是 UB 的特点之一,行为是未定义,并且有时似乎可以工作,而实际上这是一个非常严重的问题问题。
关于c - 为什么 free() 释放数据但保存 next_node 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32858250/