typedef struct s_files
{
char *name;
struct s_files *next;
} t_files;
t_files *add_files()
{
DIR *pDir;
struct dirent *pDirent;
t_files *head = (t_files *)malloc(sizeof(t_files));
t_files *cur = head;
pDir = opendir(".");
while((pDirent = readdir(pDir)))
{
if(cur == NULL)
cur = (t_files *)malloc(sizeof(t_files));
cur->name = pDirent->d_name;
cur->next = NULL;
cur = cur->next;
}
closedir(pDir);
return (head);
}
void print_files(t_files *head)
{
for ( ; head != NULL; head = head->next )
printf( "%s ", head->name);
}
我正在尝试将文件名从不同的结构存储到链接列表中。但是当我尝试打印全部时,只输出第一个。
输出应类似于“ls -a”
尝试:
t_files *add_files()
{
DIR *pDir;
struct dirent *pDirent;
t_files *head;
t_files *cur = NULL;
pDir = opendir(".");
while((pDirent = readdir(pDir)))
{
if (cur == NULL)
{
cur = (t_files *)malloc(sizeof(t_files));
head = cur;
}
else
{
cur->next = (t_files *)malloc(sizeof(t_files));
cur = cur->next;
}
cur->name = pDirent->d_name;
}
cur->next = NULL;
closedir(pDir);
return (head);
}
首先你直接覆盖了第一个节点,导致内存泄漏。然后,您将 cur 递增到下一个节点,但随后您失去了指向最后一个节点的指针,因此您没有将下一个节点分配给最后一个节点。这会导致内存泄漏,并且除了第一个节点之外,您不会保存任何信息。
请注意,此代码与您的代码一样,不会检查 malloc 是否返回 NULL,而您应该始终这样做。
始终考虑将 if 封装到块中。因此出现了严重的错误。