尝试将文件/文件夹名称从直接结构存储到链接列表

问题描述 投票:0回答:1
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”

c linked-list opendir
1个回答
0
投票

尝试:

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 封装到块中。因此出现了严重的错误。

© www.soinside.com 2019 - 2024. All rights reserved.