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);
}

我正在try 将文件名从目录 struct 存储到链表.但当我try 打印所有内容时,只输出了第一个.

输出应类似于"ls -a"

推荐答案

try :

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 = strdup(pDirent->d_name);
    }
    cur->next = NULL;

    closedir(pDir);
    return (head);
}
  • 首先,您直接覆盖了第一个 node ,导致内存泄漏.
  • 然后将cur递增到下一个 node ,但随后丢失了指向最后一个 node 的指针,因此没有将下一个 node 分配给最后一个 node .这会导致内存泄漏,而且除了第一个 node 外,您不会保存任何信息.
  • 我想你没有pDirent,所以你应该把名字的副本.确保free.

请注意,这段代码和您的代码一样,不会判断返回NULLmallocstrdup,而您应该始终这样做.

请看:为什么你可能不应该使用malloc的结果.

此外,请始终考虑将if包含在块中.由于这一点,已经出现了严重的错误.

C++相关问答推荐

C如何显示字符串数组中的第一个字母

从组播组地址了解收到的数据包长度

可以将C变量限制为特定的读/写速度吗?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

限制不同类型的限定符

如何确保在C程序中将包含uft8字符的字符串正确写入MySQL?

将回调/基于事件的C API转换为非回调API

我应该在递归中使用全局变量吗

不使用任何预定义的C函数进行逐位运算

递归打印二维数组(C编程)

如何读取程序中嵌入的数据S自己的ELF?

带有数组指针的 struct 在print_stack()函数中打印随机数

为什么会出现此错误?二进制表达式的操作数无效

Dlsym()的手册页解决方法仍然容易出错?

将char*数组深度复制到 struct 中?

为什么argc和argv即使在主函数之外也能工作?

在C中交换字符串和数组的通用交换函数

无法将字符串文字分配给 C 中的字符数组

OpenGL 中的非渐变 colored颜色 变化

无法使用 realloc 调整内存块大小