这是我的函数的简化代码:
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)
从函数体中删除 a 时,一切正常,并且 的元素sourceFiles
不会改变。
我准备了一个简单的程序https://pastebin.com/9pTYmpm2所以你可以看看会发生什么。结果示例:
如你所见,SourceFiles content 1
和SourceFiles 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);
}
但我建议您检查所有内容的返回值:opendir
, closedir
, 以及strdup
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句