取消引用指向列表的双指针

Derefrencing a double pointer to a list

这是节点

typedef struct s_list
{
    void            *content;
    struct s_list   *next;
}               t_list;
void    ft_lstclear(t_list **lst, void (*del)(void*))
{
    t_list  *temp;

    while ((*lst) != NULL)
    {
        temp = (*lst)->next;
        del((*lst)->content);
        free(*lst);
        *lst = temp;
    }
}

为什么当我从函数中删除 () 时不起作用

void    ft_lstclear(t_list **lst, void (*del)(void*))
{
    t_list  *temp;

    while (*lst != NULL)
    {
        temp = *lst->next;
        del(*lst->content);
        free(*lst);
        *lst = temp;
    }
} 

我正在尝试删除并释放给定元素和每个元素 该元素的后继者,使用函数“del” 和免费(3)。 指向列表的指针必须设置为 空。

这里的问题是 'operator precedence' (https://en.cppreference.com/w/cpp/language/operator_precedence).

从列表中可以看出,->* 具有更高的求值优先级,这意味着编译器将尝试 'access the member of **' 而不是首先取消引用 * * 变成 *.

大括号告诉编译器首先将 ** 解引用为 * 然后访问成员 属性.

实际上这很像数学。

等式:4 + 3 * 3 = 13,而 (4 + 3) * 3 = 21

后缀运算符的优先级高于一元运算符。

所以表达式

*lst->next

等同于

*( lst->next )

但是指针lst没有指向结构类型的对象。它指向另一个指针。所以这个表达式 lst->next 导致未定义的行为。