我的ls版本的另一个意外行为。
上下文:我为每个打开的目录生成一个输出列表,然后添加一个节点来显示接下来将显示哪个目录,就像原始 ls 一样。
为了处理-a
选项,当没有为我的 ls 提供 -a 选项时,我只需删除所有以 "."
开头的节点。为了避免删除显示目录路径名的节点,我检查节点内容是否以 "./"
开头,也不以 ".:"
开头。
这是代码:
t_list *ft_rem_hidden(t_list **output)
{
t_list *cursor;
t_list *tmp;
cursor = *output;
while (cursor)
{
tmp = cursor->next;
if (ft_strnequ((char const *)cursor->content, ".:", 2) == 0
&& ft_strnequ((char const *)cursor->content, ".", 1)
&& ft_strnequ((char const *)cursor->content, "./", 2) == 0)
ft_lstfreeone(output, cursor);
cursor = tmp;
}
return (*output);
}
现在有趣的部分。我在循环之前检查了(整个(列表,第一个节点的内容正如预期的那样".:"
我检查了所述节点没有通过 if,并且正如预期的那样,它没有。我在while循环后检查了列表,aaaa,".:"
不再存在。
这是ft_lstfreeone
的代码,虽然我已经使用它一段时间没有问题,但我看不到任何其他罪魁祸首。好吧,除了我的无知。
void ft_lstfreeone(t_list **alst, t_list *to_free)
{
t_list *cursor;
t_list *tmp;
if (alst && *alst && to_free)
{
cursor = *alst;
if (cursor == to_free)
{
*alst = cursor->next;
ft_memdel((void **)&cursor->content);
ft_memdel((void **)cursor);
}
else
{
while (cursor && cursor->next && cursor->next != to_free)
cursor = cursor->next;
if (cursor->next == to_free)
{
tmp = cursor->next;
cursor->next = cursor->next->next;
ft_memdel((void **)&cursor->content);
ft_memdel((void **)tmp);
}
}
}
}
我的节点在哪里?这几乎就是阻止我拥有功能性 ls 的全部原因,这相当令人愤怒。欢迎任何提示。
编辑:更多的测试表明,只有.:节点值得关注。如果我让我的 ls 显示任何其他目录的内容,它的名字在第一行显示得很好。
编辑 2:我创建了一个包含整个事情来源的 git 存储库,以防有人想仔细查看它。 https://github.com/pdecrat/ft_ls
您的代码存在多个问题 - 您实际上并没有删除节点本身,因为您没有传入指向节点的指针地址。
删除".:"的原因是ft_lstfreeone
您需要ft_memdel tmp->content
而不是cursor->content
。
按照编码,当您删除节点之后的节点时,您可能会删除".:"。
这也可能是为什么当你把 & 放在 tmp/cursor ft_memdel调用前面时 free(( 失败的原因。
正如@TonyLee评论所说,cursor
可能指向一个释放的节点,使以下cursor
成为废话。 为什么不在主代码中保存cursor->next
if
语句之前,并在if
之后设置cursor
,这样无论节点是否被释放,循环都可以安全进行,避免冒险?