使用免费功能后数据仍然可用

时间:2020-03-11 10:18:17

标签: c gcc linked-list

我有问题。我需要编写函数(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的解释。

1 个答案:

答案 0 :(得分:-1)

Lundin和Andrew Henle在评论中给出了全面的答案。谢谢你,我得到了答案。他们的答案可能会标记为解决方案:

如果您的停车票过期,为什么汽车不立即被拖走 从停车场?因为没有人必须这样做。当你 返回停车场,即使你的车可能仍然在那里 不允许这样做。或者它可能已经被拖走了,有些 那里有另一辆车,导致您触发防盗警报 尝试访问它。尚不确定会发生什么。这一切 归结为RAM内存没有魔术的“已删除”状态。 – 伦丁

这明确地列为undefined behavoir in the C standard。 您在调用free()之后使用指针:“指针的值 指通过调用free或realloc释放的空间 使用功能”。这似乎起作用了。这一次。它可能会爆炸 失败了– 安德鲁·亨利(Andrew Henle)

相关问题