我遇到了一些问题。我需要编写函数(ft_list_clear(,该函数从链表中的选定元素中删除所有元素。函数工作正常:使用此函数后,数据不在列表中,但在其他数据中仍然可用。让我展示一下。
我的主要联系人:
#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("clearedn");
print_pointer(link1);
print_pointer(link2);
print_pointer(link3);
print_pointer(link4);
printf("n");
print_linked_list(head1);
return 0;
}
我的ft.c:
#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 $
$
所以,我有一个问题:为什么第二次打印带有"444333…"的字符串。我已经解放了这段记忆。不是吗?为什么*linkN上的数据仍然可用?
添加::伦丁,天才。我认为这可能被标记为答案但是我怎么能在不打印的情况下检查呢?怎么有人能在这道题上考我?我的任务-使"免费"功能。如果我说(head=0(呢?这并不是解决办法,但在我心中却是同样的结果。感谢Andrew Henle的解释
如果你的停车罚单到期了,为什么汽车没有立即被拖走从停车场?因为没有人有义务这么做。当你回到停车场,你的车可能仍然在那里,即使它是不允许的。或者它可能被拖走了另一辆车在那里,当你尝试访问它。它没有定义会发生什么。这一切归根结底,RAM内存并没有神奇的"删除"状态Lundin
这在C标准中被明确列为未定义行为。您在调用free((之后使用指针:"指针的值指的是通过调用free或realloc释放的空间函数被使用"它可能看起来有效。这次。它可能会爆炸并失败Andrew Henle