C 中释放链表中节点的小改进

Lin*_*yen 4 c malloc free declaration linked-list

看一下这段代码,它想要释放 C 中链表内所有分配的节点:

    ptr = list;
    while (ptr != NULL)
    {
        node *next = ptr->next;
        free(ptr);
        ptr = next;
    }
Run Code Online (Sandbox Code Playgroud)

原因是,在释放当前节点之前,我们需要一个临时变量 next 来存储指向下一个节点的指针。

你看到它node *next = ptr->next;在循环内部了吗?这样每次循环运行时,都会创建一个新的临时节点来存储指向下一个节点的指针。如果我们在循环外部创建变量节点并在循环内部重新分配它,是不是更好?

像这样:

    ptr = list;
    node *next = NULL;
    while (ptr != NULL)
    {
        next = ptr->next;
        free(ptr);
        ptr = next;
    }
Run Code Online (Sandbox Code Playgroud)

这样效率会更高吗?

Ted*_*gmo 6

创建一个新的临时节点来存储指向下一个节点的指针

不,创建了一个新的临时节点指针

这两个版本可能会被优化为完全相同的汇编代码,可以在这个演示中看到,其中生成两个相同的函数,也生成。