【问题标题】:Freeing linked list in C在 C 中释放链表
【发布时间】:2014-02-07 20:46:49
【问题描述】:

您好,我正在尝试编写一个函数,该函数接收链表的头部并释放它分配的所有内存。这是我写的原始代码。

void clear_nodes(List *h) {
    if (!h->next) {
        free(h);
        ***h = NULL;***
    }
    else {
        clear_nodes(h->next);
        clear_nodes(h);
    }
}

但是它不起作用。所以我把它改成了

void clear_nodes(List *h) {
    if (!h->next) {
        free(h);
    }
    else {
        clear_nodes(h->next);
        ***h->next = NULL;***
        clear_nodes(h);
    }
}

现在它起作用了。 注意两者之间的区别,我只是想知道为什么我不能直接将指针设为空。是因为它是局部变量还是什么?但是将指针标记为 null 应该使指针指向一些我无法访问的内存地址吗?我是在本地还是在全球范围内进行这有什么关系。

提前谢谢你们。

【问题讨论】:

    标签: c linked-list


    【解决方案1】:

    我可能会非递归地这样做

    void clear_nodes(List **h) {
        List * copy = *h;        
    
        while( (copy = (*h)->next) != NULL){
            free(*h);
            *h = NULL;
            *h = copy;
        }
    }
    

    递归通常比循环慢。如果您可以尝试在没有递归例程的情况下进行设计。

    【讨论】:

    • *copy明确分配空间不是更好吗?诸如List *copy; while((copy = (*h)->next) != NULL){ 之类的东西。对于您提出的List **copy = h;,我的大脑很痛,试图保持头脑清醒,以免最终覆盖指针。
    • 从技术上讲,第一行可能是 List * copy = h;然后所有的( copy)都可以变成简单的“copy”。
    • 是的——我就是这么说的......它肯定会让我头脑清醒。
    • @Floris - 我修改了我们的 cmets :-) 感谢您的评论。
    • 现在我可以按照你的代码进行操作,我终于可以投票了。尽管它没有解决 OP 的原始问题,但“不要递归地执行此操作”的建议是合理的,并且在销毁当前对象之前制作“下一件事”的副本看起来是合理的。虽然我怀疑它会使内核管理内存块的工作变得更加困难......如果删除“后进先出”,则不太可能导致碎片。
    【解决方案2】:

    由于传递了 h 的 value,而不是 location,因此您没有更改指针 - 您正在更改指针的副本。

    如果您将功能更改为

    void clear_nodes(List **h) {
        if ((*h)->next == NULL) {
            free(*h);
            *h = NULL;
        }
        else {
            clear_nodes(&((*h)->next));
            clear_nodes(h);
        }
    }
    

    您可以“本地”更改它。我认为第二部分是正确的...没有尝试编译/运行它。不过我对第一部分持肯定态度。

    【讨论】:

    • 是的,但是h的值是一个地址,即使它的副本也应该指向同一个地址对吧?现在我把它的副本地址改成了我不能访问的地址,这不也影响到原来的h吗?
    • 是的,但是如果您更改副本的值,则不会更改原始值。如果我给你一张 100 美元的借条,并保留一份借条,我可以更改我的副本,说我欠你 10 美元,但事实并非如此。
    猜你喜欢
    • 2016-06-22
    • 2011-05-04
    • 2021-07-07
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多