首页 > 解决方案 > 包含结构的自由链表包含结构

问题描述

这是给学校的。

我正在研究 Unix 'ls' 命令的实现。为此,我每次读取目录时都使用链表(如果未设置 -R 选项,则只有一次)。为此,我必须使用我们必须在以前的项目中编写的链接列表函数和节点(或元素,我不确定正确的名称是什么。)。这些节点如下所示:

typedef struct s_list
{
    void          *content;
    size_t         content_size;
    struct s_list *next;
}t_list;

在我的 ls 程序中,我使用这些来存储我列出的目录中的每个文件的名称和统计信息,通过 stat() 函数获得。所以我的 t_list 的“内容”指针是这个结构:

typedef struct s_entry
{
    char       *filename;
    struct stat filestat;
}t_entry;

一切正常,我遇到的唯一问题是 Valgrind 告诉我,用于分配这些 t_entry 结构的 malloc() 存在泄漏。所以我想我是在错误地释放它们..我是这样做的:

void    free_list(t_list *entries)
{
    t_list *n_node;

    if (!entries)
        return ;
    while (entries)
    {
        n_node = entries->next;
        free(entries->content);
        free(entries);
        entries = n_node;
    }
}

我猜仅仅释放 *content 指针是不够的,但我尝试了其他方法,但它不会起作用。如果我尝试释放喜欢

free(entries->content->filename);

例如,它不起作用,并且内容是空指针这一事实在某些方面似乎是一个问题,我试图解决这个问题,但这就是我们必须编写这些链表函数的方式。

如果有人能给我一个关于如何正确释放这些列表的提示,那就太棒了,因为我真的坚持这一点。提前致谢。对不起,如果我的英语或解释不够清楚。

ps:以防万一,整个项目(远未完成)可以在这里找到: https ://github.com/Zestx/ft_ls

标签: cstructlinked-listfreels

解决方案


您需要转换数据,以便编译器知道在哪里可以找到结构成员,这是一个完整的示例:

#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

typedef struct s_list
{
    void          *content;
    size_t         content_size;
    struct s_list *next;
}t_list;

typedef struct s_entry
{
    char       *filename;
    struct stat filestat;
}t_entry;

int main(void)
{
    t_list *foo = malloc(sizeof *foo);
    t_entry *bar = malloc(sizeof *bar);
    bar->filename = malloc(10);
    foo->content = bar;

    free(((t_entry *)foo->content)->filename);
    free(foo->content);
    free(foo);

    return 0;
}

推荐阅读