closedir()导致现有列表节点的更改

时间:2018-03-31 14:43:39

标签: c list closedir

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

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

我在main函数中使用:

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

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

但是,当我从函数体中删除closedir(dir)时,一切正常,sourceFiles的元素不会更改。

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

Result of test program

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

Result after removing closedir(dir)

这里发生了什么?为什么会这样?怎么预防呢?我不应该在我的程序中使用closedir()吗?

1 个答案:

答案 0 :(得分:1)

问题似乎是您正在使用entry->d_name的名称创建节点。但是条目是堆叠分配struct,一旦退出listFilesInDirectory,它将变为无效。

一个简单的解决方法:

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

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