这是节点
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(。指向列表的指针必须设置为NULL。
这里的问题是"运算符优先级"(https://en.cppreference.com/w/cpp/language/operator_precedence)。
从列表中可以看出,->
的求值优先级高于*
,这意味着编译器将尝试"访问**的成员",而不是首先将**解引用为*。
大括号告诉编译器首先将**取消引用为*,然后访问成员属性。
事实上,这很像数学。
方程为:4 + 3 * 3 = 13
,而(4 + 3) * 3 = 21
。
因此表达式
*lst->next
相当于
*( lst->next )
但是指针CCD_ 5不指向该结构类型的对象。它指向另一个指针。所以这个表达式lst->next
导致了未定义的行为。