0

这是我的功能的简化代码:

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/");

问题是函数的第二次调用会更改在第一次调用中返回的列表元素。元素的sourceFilesbecome changed afterlistFilesInDirectory("dest/");被调用。

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

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

测试程序的结果

正如你所看到的,SourceFiles content 1并且SourceFiles content 2是不同的。第一个是在listFilesInDirectory("dest/")调用之前打印的,第二个是在调用之后打印的。但是,如果我closedir(dir)从功能中删除一切正常:

删除 closedir(dir) 后的结果

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

4

1 回答 1

1

问题似乎是您正在使用直接从entry->d_name. 但是条目是堆栈分配struct的,一旦您退出,它将变得无效listFilesInDirectory

一个简单的修复:

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

但我建议您检查所有内容的返回值:opendir, closedir, 以及strdup.

于 2018-03-31T15:10:42.053 回答