【问题标题】:Derefrencing a double pointer to a list取消引用指向列表的双指针
【发布时间】:2021-12-30 00:46:46
【问题描述】:

这是节点

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)。 指向列表的指针必须设置为 空。

【问题讨论】:

  • 为什么要编译? lst->next(*lst)->next 不同。您还需要将t_list **lst 更改为t_list *lst
  • 但是当我使用 *lst -> next 它也不起作用
  • ()的目的是什么
  • ** 表示“指向指针数组的指针”。因此,list[0]*list 引用“同一个指针”。

标签: c pointers undefined-behavior dereference


【解决方案1】:

这里的问题是“运算符优先级”(https://en.cppreference.com/w/cpp/language/operator_precedence)。

从列表中可以看出,-> 的评估优先级高于 *,这意味着编译器将尝试“访问 ** 的成员”,而不是首先将 ** 解引用为*.

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

实际上,这很像数学。

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

【讨论】:

  • 太你了,现在很有意义
  • 不客气。密切关注运算符优先级总是一个好主意。另外,请记住接受对您帮助最大的答案,这样人们就会知道您不再需要帮助。
【解决方案2】:

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

所以表达

*lst->next

等价于

*( lst->next )

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2012-01-04
    相关资源
    最近更新 更多