这是我的函数的简化代码:
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,这样你就可以看到会发生什么。 示例结果:
如您所见,SourceFiles content 1
和SourceFiles content 2
不同。第一个是在调用listFilesInDirectory("dest/")
之前打印的,第二个是在之后打印的。但是,如果我从函数中删除closedir(dir)
,则一切正常:
这里发生了什么?为什么会这样?怎么预防呢?我不应该在我的程序中使用closedir()
吗?
答案 0 :(得分:1)
问题似乎是您正在使用entry->d_name
的名称创建节点。但是条目是堆叠分配struct
,一旦退出listFilesInDirectory
,它将变为无效。
一个简单的解决方法:
while ((entry = readdir(dir)) != NULL) {
myNode* node = createNode(strdup(entry->d_name));
addToList(list, node);
}
但我建议您检查所有内容的返回值:opendir
,closedir
以及strdup
。