c -擦除链表的函数是否正确?



使用以下结构体:

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 listan");
free(registro);
registro=aux;
}
free(registro);
registro = NULL;
}

我看到的问题:如果我在调用eliminarListaEntera之前和之后在main()中运行以下代码:

printf("POINTER %pn", (void *) primerNodo);

得到相同的值。它不应该是0 (NULL)后调用删除函数?

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

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

语句registro = NULL;设置registroNULL,对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 listan");
free(registro);
registro=aux;
}
free(registro);
*p = NULL;  // Set the original pointer to NULL.
}

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