c - 为什么 free() 释放数据但保存 next_node 值?

标签 c list free

我正在使用列表进行训练,从某个时候开始我想知道 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/

相关文章:

c - 为什么我不能使用 `=` 复制数组?

c++ - 如何将这个成对列表转换为包含数组数组的对象?

在 C 中对指向外部变量的指针调用 free

html - 将 li 直线向下对齐

python - 如何从列表中删除从开始到结束的范围

c - 在 C 中重用释放的指针

c - 无效的 free()/delete/delete[]/realloc()

c - C语言中变量名后面的括号有效还是无效?

c - 编译C代码时Makefile错误

c - 为什么我不能使用 gcc 生成 "Hello World"可执行文件?