微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在单向链表的head_node(first_node)初始化时动态分配释放“两次”?

如何解决为什么在单向链表的head_node(first_node)初始化时动态分配释放“两次”?

我想知道twice of dynamic allocation release.
的原因 我认为,在初始化头节点时只使用一次 free function

这是代码!! :)

int freeList(headNode* h){
    listNode* p = h->first;
    listNode* prev = NULL;   
    
    while(p != NULL) {      
        prev = p;           
        p = p->link;         
        free(prev);    /* Here is a problem
                        What is a few errors with just coding free(prev)? */    
    }
    free(h);  /* Here is a problem */  
    return 0;
}

解决方法

free(prev)free(h) 是关于不同的数据结构:

  • free(prev) 正在释放 listNode 实例的内存
  • free(h) 正在释放 headNode 实例的内存。

headNode 是一个有点令人困惑的名称,因为我认为该结构实际​​上并不代表列表中的 第一个 节点,而是列表的“容器”。它有一个 first 指针,它可以是 NULL(如果表示的链表为空),也可以是指向第一个节点的指针。无论哪种方式,headNode 实例都不同于它可能引用的第一个节点的实例(仅当表示的链表不为空时)。

因此您的循环释放了列表中所有节点的内存,而对 free 的最终调用是关于 headNode 实例,它不是 of 的一个节点链表,但它是用于链表的容器。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。