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 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);
}
但我建议您检查所有内容的 return 值:opendir
、closedir
以及 strdup
.
这是我的函数的简化代码:
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 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);
}
但我建议您检查所有内容的 return 值:opendir
、closedir
以及 strdup
.