我有问题。我需要编写函数(ft_list_clear),该函数将从链接列表中的选定元素中删除所有元素。该功能正常工作:使用该功能后,数据不在列表中,但在其他数据中仍然可用。让我展示一下。
我的main.c:
#include <stdlib.h>
#include "hd.h"
#include "ft.c"
t_list *ft_create_elem(void *data)
t_list *ft_list_push_params(int arc, char **arv);
void ft_list_clear(t_list **head);
void print_pointer(void *data)
{
printf("%s ", *&data);
}
void print_linked_list(t_list *head)
{
t_list *node = head;
while (node)
{
print_pointer(node->data);
node = node->next;
}
printf("\n");
}
int main(int argc, char **argv)
{
head1 = ft_list_push_params(argc, argv);
print_linked_list(head1);
void *link1 = head1->data;
void *link2 = head1->next->data;
void *link3 = head1->next->next->data;
void *link4 = head1->next->next->next->data;
print_pointer(link1);
print_pointer(link2);
print_pointer(link3);
print_pointer(link4);
printf("\n");
ft_list_clear(&head1);
printf("cleared\n");
print_pointer(link1);
print_pointer(link2);
print_pointer(link3);
print_pointer(link4);
printf("\n");
print_linked_list(head1);
return 0;
}
我的英尺:
#include "hd.h"
t_list *ft_create_elem(void *data)
{
t_list *node;
if (!(node = malloc(sizeof(t_list))))
return (0);
node->data = data;
node->next = 0;
return (node);
}
void ft_list_push_front(t_list **head, void *data)
{
t_list *node;
if (!(*head))
*head = ft_create_elem(data);
else
{
node = ft_create_elem(data);
node->next = *head;
*head = node;
}
}
t_list *ft_list_push_params(int ac, char **av)
{
t_list *head;
int i;
i = 1;
head = 0;
while (i < ac)
{
ft_list_push_front(&head,av[i]);
i++;
}
return (head);
}
void ft_list_clear(t_list **begin_list)
{
if (*begin_list && (*begin_list)->next)
ft_list_clear(&(*begin_list)->next);
free(*begin_list);
*begin_list = 0;
}
标题:
#ifndef FT_LIST_H
# define FT_LIST_H
typedef struct s_list
{
struct s_list *next;
void *data;
} t_list;
#endif
要运行的代码:
gcc main.c | ./a.out 111 222 333 444 | cat -e
在这种情况下,我一直关注输出:
444 333 222 111 $
cleared$
444 333 222 111 $
$
所以,我有一个问题:为什么第二次打印带有“ 444 333 ...”的字符串。我有这个记忆。不?为什么* linkN上的数据仍然可用?
添加了:: 伦丁,亲切地。我认为可以将其标记为答案。但是,如何在不打印的情况下进行检查?有人可以在这个问题上考试我吗?我的任务-使“免费”功能。如果我说(头= 0)怎么办?这不是解决方案,但在我心中却是相同的结果。 感谢Andrew Henle的解释。
答案 0 :(得分:-1)
Lundin和Andrew Henle在评论中给出了全面的答案。谢谢你,我得到了答案。他们的答案可能会标记为解决方案:
如果您的停车票过期,为什么汽车不立即被拖走 从停车场?因为没有人必须这样做。当你 返回停车场,即使你的车可能仍然在那里 不允许这样做。或者它可能已经被拖走了,有些 那里有另一辆车,导致您触发防盗警报 尝试访问它。尚不确定会发生什么。这一切 归结为RAM内存没有魔术的“已删除”状态。 – 伦丁
这明确地列为undefined behavoir in the C standard。 您在调用free()之后使用指针:“指针的值 指通过调用free或realloc释放的空间 使用功能”。这似乎起作用了。这一次。它可能会爆炸 失败了– 安德鲁·亨利(Andrew Henle)