c - 包含结构的自由链表包含结构
问题描述
这是给学校的。
我正在研究 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
解决方案
您需要转换数据,以便编译器知道在哪里可以找到结构成员,这是一个完整的示例:
#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;
}
推荐阅读
- java - 从方法返回多个系列
- c# - 当我尝试打开 PDF 时,Xamarin C#“我们无权打开此文件”
- azure-blob-storage - ADLS Gen2 上的 Polybase - CSV 文件作为源失败并出现“HdfsBridge::recordReaderFillBuffer”错误
- javascript - 异步调用后如何自动对焦选择输入?
- angular - 单个水疗中心不会同时显示两个应用程序
- python - 无法将 NumPy 数组转换为张量(不支持的对象类型浮点数)
- r - 如果满足三个条件,R子集3d数组并修改特定值
- python - 如果尚不存在,Django 多对一创建父(“一个”)条目
- ruby-on-rails - 将 puma / systemd 与套接字激活一起使用有什么好处?
- c# - 开发与 .NET Core 1 和 .NET Core 3 相同的 .NET Core 源代码