這是節點
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' 和 free(3) 洗掉和釋放給定元素以及該元素的每個后繼元素。指向串列的指標必須設定為 NULL。
uj5u.com熱心網友回復:
這里的問題是“運算子優先級”(https://en.cppreference.com/w/cpp/language/operator_precedence)。
從串列中可以看出, the 的計算->優先級高于*,這意味著編譯器將嘗試“訪問 ** 的成員”,而不是首先將 ** 解參考為 *。
大括號告訴編譯器首先將 ** 解參考為 *,然后訪問成員屬性。
實際上,這很像數學。
等式:4 3 * 3 = 13,而(4 3) * 3 = 21。
uj5u.com熱心網友回復:
后綴運算子的優先級高于一元運算子。
所以運算式
*lst->next
相當于
*( lst->next )
但指標lst不指向結構型別的物件。它指向另一個指標。所以這個運算式會lst->next導致未定義的行為。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361008.html
