Данные все еще доступны после использования бесплатной функции - PullRequest
1 голос
/ 11 марта 2020

У меня есть некоторые проблемы. Мне нужно написать функцию (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)? Это не решение, но тот же результат, на мой взгляд. Спасибо Эндрю Хенле за объяснения.

1 Ответ

0 голосов
/ 11 марта 2020

Лундин и Эндрю Хенле дают исчерпывающие ответы в комментариях. Спасибо за это, я получил ответ. Их ответы могут быть помечены как решения:

Если срок действия вашего парковочного билета истекает, почему автомобиль не отбуксирован немедленно с парковки? Потому что никто не обязан это делать. Когда вы вернетесь на парковку, ваш автомобиль все еще может быть там, даже если это не разрешено. Или, возможно, его отбуксировали, и там есть какая-то другая машина, что заставляет вас активировать охранную сигнализацию при попытке доступа к ней. Не определено, что будет. Все это сводится к тому, что оперативная память не имеет магического c «удаленного» состояния. - Lundin

Это явно указано как неопределенное поведение в стандарте C . Вы используете указатель после вызова free (): «Используется значение указателя, которое относится к пространству, освобожденному при вызове функции free или realloc». Может показаться, что это работает. В этот раз. Это может взорваться и потерпеть неудачу. - Эндрю Хенле

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...