如果我想销毁链表和释放内存,我不能直接放 head=NULL 吗?

Can't I directly put head=NULL if i want to destroy linked list and free memory?

为什么我们需要 free()?将头节点设置为 NULL 可以起到类似的作用,不是吗?

因为 C 中没有垃圾收集器。这意味着您应该自己收集垃圾。 您在堆上分配的所有内容都必须手动删除。 忘记做就叫内存泄漏.

它们不等价。

在 C 中,如果显式分配内存(例如,使用 malloc),则需要显式释放它(使用 free)。

如果你只是赋值head = NULL,你将无法访问链表中的以下元素,但它们的内存仍会被分配——进程仍会持有这块内存,而你'你手上会有内存泄漏。

Why do we need free()?

函数free用于释放动态分配的内存。

Putting the head node as NULL does similar work, doesn't it?

将 NULL 放入指向头节点的指针中并不会释放列表中所有动态分配的内存,既不会为头节点也不会为其他节点释放内存。这会导致丢失第一个动态分配节点的地址,结果你会得到大量内存泄漏,因为内存变得不可访问(但未释放)..

考虑以下演示程序。

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
    int *p1 = malloc( sizeof( int ) );
    
    *p1 = 10;
    
    printf( "*p1 = %d\n", *p1 );
    
    int *p2 = p1;
    
    p1 = NULL;
    
    printf( "*p2 = %d\n", *p2 );
    
    free( p2 );
    
    return 0;
}

它的输出是

*p1 = 10
*p2 = 10

在程序中,为int类型的对象动态分配了内存,分配内存的地址已分配给指针p1

NULL分配给指针p1后,分配的内存地址不再存储在该指针中。

所以如果地址没有分配给第二个指针p2那么分配内存的地址将永远丢失,我们无法释放内存。

只有在指针中有地址的副本 p2 我们才能释放分配的内存。

因此将指针设置为 NULL 只会更改存储在指针中的值。分配的内存不会以任何方式被触及。