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++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

C中空终止符后面的数字?

以c格式打印时间戳

exit(EXIT_FAILURE):Tcl C API类似功能

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

丑陋的三重间接:可扩展的缓冲区管理 struct

如何设置指针指向在函数中初始化的复合文字中的整数?

如何将字符串传递给函数并返回在C中更改的相同字符串?

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

如何在C中引发/处理自定义信号?

我在这里正确地解释了C操作顺序吗?

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

将返回的char*设置为S在函数中定义的字符串文字可能会产生什么问题?

C11/C17标准允许编译器清除复合文字内存吗?

CS50判断灯泡运动的问题,判断时多出一个灯泡,但不在终端上

GCC认为这是一个VLA是对的吗?

令人困惑的返回和 scanf 问题相关

使用 c 中的 write() 函数将非 ASCII 字符写入标准输出

使用替代日历打印日期

C Makefile - 如何避免重复提及文件名