取消引用指向列表的双指针
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
导致未定义的行为。
这是节点
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
导致未定义的行为。