这个擦除链表的函数是否正确?

Is this function to erase a linked list correct?

使用以下结构:

typedef struct lista {
    int num;
    struct lista * sig;
} nodo;

然后我们有如下函数来擦除之前struct节点组成的链表:

void eliminarListaEntera(nodo * registro) {
    nodo * aux = NULL;
    
    while(registro->sig != NULL){
        aux=registro->sig;
        printf("Borrando nodo de la lista\n");
        free(registro);
        registro=aux;
    }
    free(registro);
    registro = NULL;
}

我遇到的问题:如果我 运行 在调用 eliminarListaEntera 之前和之后在 main() 中执行以下操作:

printf("POINTER %p\n", (void *) primerNodo);

我得到了相同的值。调用delete函数后不应该是0(NULL)吗?

如果我再次尝试遍历它,我只会得到一个随机值,如 -159426562,我猜这是因为它正在从内存中检索垃圾值。

main调用eliminarListaEntera(primerNodo)时,传递的是primerNodo的值。在 eliminarListaEntera 中,参数 registro 是一个单独的对象,不以任何方式引用 main.

中的 primerNodo

语句registro = NULL;registro设置为NULL,对main中的primerNodo没有影响。

如果你想让一个被调用的函数影响调用者中的一个对象,你可以传递一个指向该对象的指针:

void eliminarListaEntera(nodo **p) {
    nodo *registro = *p;  // Copy the original pointer for ease of use.
    nodo * aux = NULL;
    
    while(registro->sig != NULL){
        aux=registro->sig;
        printf("Borrando nodo de la lista\n");
        free(registro);
        registro=aux;
    }
    free(registro);
    *p = NULL;  // Set the original pointer to NULL.
}

然后main可以用eliminarListaEntera(&primerNodo);调用这个例程。