c - 释放链表中的节点

标签 c memory linked-list

假设我在 C 中有以下链表实现:

List *create_node(int v) {
    List *node = malloc(sizeof(List));
    free(node);
    node->value = v;
    node->next = NULL;
    return node;
}

List *add_node(List *h, int v) {
    List *node = create_node(v);
    node->next = h;
    return node;
}

并且我想释放列表的所有节点;我尝试编写该函数

List *remove_list(List *h) {
    while(h != NULL) {
            List *x;
            x = h;
            h =  h->next;
            free(x);
    }
    free(x);

}

但是这不起作用。如何释放链表中的所有节点?

最佳答案

您必须在 create_node 代码本身中遇到段错误,因为您取消引用已释放的内存:

...
List *node = malloc(sizeof(List));
free(node);
node->value = v;
...

您已经释放您创建的所有节点,然后取消引用该位置,您的remove_list甚至不会被调用。

关于c - 释放链表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21619904/

相关文章:

c++ - 为什么标准字符串函数比我的自定义字符串函数更快?

C 如何做到这一点,以便在某些东西不相等时执行此操作

javascript - 使用 Angular 的 $compile 和新范围时的内存泄漏

scala - 为什么 Scala 集合中没有不可变的双链表?

c - 在 if 语句中,如果我给变量赋值,是否必须在 else 语句中再次执行?

C++ 强制 new[] 不分配 4 个额外的字节

iphone - NSManagedObjectContext executeFetchRequest 返回不稳定的对象,导致 EXC_BAD_ACCESS、SIGABRT 等

sql - 如何在sql中对链表进行排序?

java - 转换同步链表时出错

c - 客户端和服务器之间的 UDP 连接未在我的 Mac 上加载