在C结构中使用free()的正确方法是什么

在C结构中使用free()的正确方法是什么,c,list,memory,free,C,List,Memory,Free,我对C中的结构和自由操作有点困惑。 我必须使用这个结构(我知道用define*tList代替tList不是最好的主意,但必须是这样) bif指向previus元素,所以y不释放(),因为我认为它没有必要 Malloctlistlist=(tList)Malloc(sizeof(struct cel)) 然后我需要释放内存。我不知道什么方法是正确的 给limpiar打电话 void limpiar (tList borrar) { tList aux; tList aBorra

我对C中的结构和自由操作有点困惑。 我必须使用这个结构(我知道用define*tList代替tList不是最好的主意,但必须是这样)

bif指向previus元素,所以y不释放(),因为我认为它没有必要

Malloc
tlistlist=(tList)Malloc(sizeof(struct cel))

然后我需要释放内存。我不知道什么方法是正确的

给limpiar打电话

 void limpiar (tList  borrar)
{
    tList aux;
    tList aBorrar;

    for(aBorrar = borrar; aBorrar != NULL; aBorrar = aux)
    {
        aux=aBorrar->next;
        free(aBorrar);
    }  
    return;
}

使用列表调用limpiar(&L)

void limpiar (tList  * borrar)
    {
        tList aux;
        tList aBorrar;

        for(aBorrar = *borrar; aBorrar != NULL; aBorrar = aux)
        {
            aux=aBorrar->next;
            free(aBorrar);
        }  
        return;
    }

如果通过引用传递列表(第二个选项),则可以清除调用者数据中指向列表的指针,或者至少清除其中一个指针。虽然这不是严格必要的,也不是一个完美的解决方案,但它是一种良好的编程风格,减少了在
free
之后引用单元格或调用
free
两次的可能性。该功能应按以下方式修改:

void limpiar(tList *borrar)
{
    tList aux;
    tList aBorrar;

    for (aBorrar = *borrar; aBorrar != NULL; aBorrar = aux) {
        aux = aBorrar->next;
        free(aBorrar);
    }
    *borrar = NULL;
}
limpiar(&list);
// list is NULL now.
在调用者中,您可以通过以下方式调用
limpiar

void limpiar(tList *borrar)
{
    tList aux;
    tList aBorrar;

    for (aBorrar = *borrar; aBorrar != NULL; aBorrar = aux) {
        aux = aBorrar->next;
        free(aBorrar);
    }
    *borrar = NULL;
}
limpiar(&list);
// list is NULL now.

您正确地使用了free。但是你的代码可能是错的。使用不是从malloc获得的指针值调用它或执行double-free。
sig
在您的示例中不是结构的成员。你忘了翻译那部分吗?bif的
bif
呢?显示如何为这些结构分配内存是相关的。
limpiar
的两个实现都会做同样的事情,但第一个更好/更常见,因为第二个实现中添加的间接寻址不接受任何内容,允许调用方允许代码取消引用NULL。对不起,我没有翻译。现在我认为它是正确的,我添加了malloc。我不理解“调用方允许代码取消引用空值”@rpattiso:OP正在处理双链表,
bif
指向上一个单元格,因此它不是免费的。OP要求通过引用还是通过值传递列表标题。请参考以下问题。这可能对你有帮助!和