【问题标题】:Is this function to erase a linked list correct?这个删除链表的功能是否正确?
【发布时间】:2021-12-01 01:36:40
【问题描述】:

使用以下结构:

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

然后我们有以下函数来擦除由先前结构节点形成的链表:

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 这样的随机值,我猜这是因为它正在从内存中检索垃圾值。

【问题讨论】:

  • free() 函数无法将指针设置为 NULL。
  • 我明白了。我的意思是......我希望在删除列表后运行该 printf 函数时得到 0 或 NULL(鉴于我什至在完成函数之前将指针设置为 NULL)但事实并非如此。只是为了检查:如果我打印“指针”,它就是它指向的地址。 “&Pointer”将是该指针在内存中的地址,“*pointer”将取消引用该指针并检索它指向的值,对吗?因此,为什么我期望 0...
  • 您必须将指向指针的指针传递到您的函数中才能更改调用函数中的值。这就是为什么free() 也不能将指针设置为 NULL。函数的最后一行没有任何用处。
  • 您只需将primerNodo 的副本传递给该函数。实变量 primerNodo 不能从该函数内部修改。除此之外:你甚至不应该知道你会在那个地址找到什么值,因为在你把那个地址传递给free之后你就不能再访问那个内存了。
  • @JonathanLeffler:free 是否可以将指针设置为NULL 无关紧要。 eliminarListaEntera 例程将registro 设置为NULL,问题是为什么main 中的指针不是NULL

标签: c pointers linked-list


【解决方案1】:

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);调用这个例程。

【讨论】:

  • 啊!那么这就解释了。但是等一下...我看到了其他 cmets...所以我需要做一些类似 eliminarListaEntera(nodo ** registro)??只有这样我才能在函数内部将其设置为 NULL?
  • @4d4143: 我更新了一个方法来改变main中的指针。
  • 嗯,现在我有点困惑。为什么需要使用&?
  • @4d4143:当用作参数时(或者,通常在任何表达式中用作其值时),xx 的值。 &xx 的地址。要给函数一个指向对象的指针,你必须提供它的地址,而不是它的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 1970-01-01
  • 2020-06-17
  • 2011-04-26
相关资源
最近更新 更多