closedir() 导致现有列表的节点发生变化

closedir() causes changes in existing list's nodes

这是我的函数的简化代码:

myList* listFilesInDirectory(char* path) {
    DIR* dir = opendir(path);
    myList* list = createList();
    struct dirent* entry;

    while ((entry = readdir(dir)) != NULL) {
        myNode* node = createNode(entry->d_name);
        addToList(list, node);
    }
    closedir(dir);
    return list;
}

我在主函数中使用的:

myList* sourceFiles = listFilesInDirectory("source/");
myList* destFiles = listFilesInDirectory("dest/");

问题是第二次调用函数更改了第一次调用返回的列表元素。 sourceFiles 的元素在调用 listFilesInDirectory("dest/"); 后发生变化。

但是当我从函数体中删除一个 closedir(dir) 时,一切正常并且 sourceFiles 的元素没有改变。

我准备了一个简单的程序https://pastebin.com/9pTYmpm2所以你可以看看会发生什么。 结果示例:

如您所见,SourceFiles content 1SourceFiles content 2 是不同的。第一个是在调用 listFilesInDirectory("dest/") 之前打印的,第二个是在调用之后打印的。但是如果我从函数中删除 closedir(dir) 一切正常:

这是怎么回事?为什么会这样?如何预防?我不应该在我的程序中使用 closedir() 吗?

问题似乎是您正在使用直接来自 entry->d_name 的名称创建节点。但是入口是堆栈分配的 struct 一旦你退出 listFilesInDirectory.

它将变得无效

一个简单的修复:

while ((entry = readdir(dir)) != NULL) {
        myNode* node = createNode(strdup(entry->d_name));
        addToList(list, node);
}

但我建议您检查所有内容的 return 值:opendirclosedir 以及 strdup.