Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用自由函数后数据仍然可用_C_Gcc_Linked List - Fatal编程技术网

C 使用自由函数后数据仍然可用

C 使用自由函数后数据仍然可用,c,gcc,linked-list,C,Gcc,Linked List,我有一些问题。我需要编写一个函数(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),从链表中的选定元素中删除所有元素。功能正常工作:使用此功能后,数据不在列表中,但在其他数据中仍然可用。让我看看

我的主要意见是:

#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;
}
要运行的代码:

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的解释。Lundin和Andrew Henle在评论中给出了全面的答案。谢谢你,我得到了答案。他们的答案可以标记为解决方案:


如果你的停车罚单过期了,为什么不立即把车拖走 从停车场?因为没有人有义务这么做。当你 回到停车场,你的车可能还在那里,即使 这是不允许的。或者它可能被拖走了 另一辆车在那里,当你开车时会触发它的防盗警报器 尝试访问它。还没有确定会发生什么。到底是什么 归根结底,RAM内存没有神奇的“删除”状态 Lundin

这被明确列为。 您在调用free()后正在使用指针:“指针的值 这是指通过调用free或realloc释放的空间 函数被使用“它可能看起来工作”。这一次。它可能会爆炸 然后失败Andrew Henle


每个节点的malloc内存在哪里?这是否回答了您的问题@Yunnosch他调用free()但他不调用alloc()。我只是忘记了在ft.c添加ft_create_elem()函数。增加了,但问题仍然存在。如果您的停车罚单过期,为什么不立即将车辆拖离停车场?因为没有人有义务这么做。当你回到停车场时,你的车可能仍然在那里,即使它是不允许的。或者它可能被拖走了,而其他车也在那里,当你试图接近它时,会触发它的防盗警报。还没有确定会发生什么。归根结底,RAM内存没有神奇的“删除”状态。
gcc main.c | ./a.out 111 222 333 444 | cat -e
444 333 222 111 $
cleared$
444 333 222 111 $
$