У меня есть некоторые проблемы. Мне нужно написать функцию (ft_list_clear), которая удаляет все элементы из выбранного элемента в связанном списке. Функция работает корректно: после использования этой функции данные отсутствуют в списке, но все же доступны в других данных. Позвольте мне показать.
Мой главный. 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;
}
Мой фут. 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 $
$
Итак, у меня есть вопрос: почему строка с "444 333. .. "печатается во второй раз. Я освободил эту память. Нет? Почему данные в * linkN по-прежнему доступны?
Добавлено :: Лундин, щедро. Я думаю, что это может быть помечено как ответ. Но как я могу проверить это без печати? Как кто-то может проверить меня в этом вопросе? Моя задача - сделать «бесплатную» функцию. Что если я скажу (голова = 0)? Это не решение, но тот же результат, на мой взгляд. Спасибо Эндрю Хенле за объяснения.