gpt4 book ai didi

c - 在作为值传递的结构地址上设置 NULL

转载 作者:行者123 更新时间:2023-11-30 19:01:01 27 4
gpt4 key购买 nike

我有一个结构列表,我将其传递给需要释放内容和列表项的函数 (*l)。

我已经使用 del 函数释放了内容,但 *lst 没有被释放。

typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;

void lstdel_f(void *d)
{
free(d);
}

void ft_lstdel(t_list *lst, void (*del)(void *))
{
(*del)(lst->content);
free(lst);
}

int main()
{
//this line creates a new list
t_list *l = ft_lstnew(ft_strdup("test"));

ft_lstdel(l, &lstdel_f);
printf("C=%s\n", l->content);

if (l != NULL)
puts("still here"); // shouldn't get here
else
puts("GOOD"); // should get here
}

我无法在函数ft_lstdel的参数中使用双指针。

有没有办法在列表上设置NULL,以便程序打印“GOOD”?

编辑:我删除了 t_list 的 Actor **

最佳答案

I cannot use double pointer in the arguments of the function ft_lstdel.

Is there anyway to set null on the list

不,没有。不是来自 ft_lstdel() 函数内部。如果您想从 ft_lstdel() 内部修改 l 的值,唯一的方法是将指针传递给它。除此之外,您可以在调用 ft_lstdel() 后在 main() 中将其设置为 NULL

您当前所做的事情是错误的,您不能将 t_list * 强制转换为 t_list ** 并期望它能够工作。您还执行了很多不必要的指针操作。OP编辑了问题。

您也没有释放整个列表。在一般情况下,您需要一个循环来扫描列表的所有 next 元素并释放整个列表,而您只释放单个元素。

删除不必要的内容,您的函数应该做的唯一事情是:

void ft_lstdel(t_list *lst, void (*del)(void *))
{
del(lst->content);
free(lst);
}

请注意,这仍然不行,因为当您应该释放所有元素时,您只释放了一个元素。

如果您希望将 l 设置为 NULL,那么您必须向它传递一个指针。 没有其他办法

void ft_lstdel(t_list **lst_ptr, void (*del)(void *))
{
t_list *lst = *lst_ptr;
del(lst->content);
free(lst);
*lst_ptr = NULL;
}

关于c - 在作为值传递的结构地址上设置 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58578820/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com