gpt4 book ai didi

c - 如何在 c 中正确使用 scandir()?

转载 作者:IT王子 更新时间:2023-10-29 00:45:23 26 4
gpt4 key购买 nike

我正在尝试将文件列表存储在 char** 变量中。

scandir() 正确完成,但在尝试打印 char** 时出现段错误。

代码如下:

int main()
{
char** fileList;
int noOfFiles;
char* path = ".";
makeList(&fileList, &noOfFiles, path);
return 0;
}

void makeList(char ***fileList, int* noOfFiles, char* path){
struct dirent **fileListTemp;
*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);
int i;
fileList = (char***)malloc(sizeof(char***));
*fileList = (char**)malloc(*noOfFiles * sizeof(char*));
printf("total: %d files\n",*noOfFiles);
for(i = 0; i < *noOfFiles; i++){
*fileList[i] = (char*)malloc(strlen(fileListTemp[i] -> d_name) *sizeof(char));
strcpy(*fileList[i], fileListTemp[i] -> d_name);
printf("%s\n",*fileList[i]);
}
return;
}

这会在打印 2 个文件名后出现段错误。

输出:

total: 27 files.

..

.j.v

Segmentation fault (core dumped)

最佳答案

scandir() 函数为您分配内存。

你不需要分配任何内存。您确实需要释放 scandir() 返回给您的内存。

您的代码调用:*noOfFiles = scandir(path, &fileListTemp, NULL, alphasort);

返回时,noOfFiles 将包含 path 目录中的目录条目数,fileListTemp 将指向分配的指针数组分配给 struct dirent blob,每个 blob 都有一个 d_name 成员,指向一个以 null 结尾的名称文件/目录。

例如,如果您的目录包含文件“FirstFile.txt”、“AnotherFile.txt”、“ThirdFile.txt”,当您从 scandir() 返回时,noOfFiles 将被设置为 5 三个文件加上另外两个“.”和“..”目录条目。如果您没有通过“alphasort”,参赛作品将没有特别的顺序。 (实际上这有点不正确。它们将按照目录文件名条目的顺序排列,这取决于文件最初创建的顺序。)

因为您通过了“alphasort”,您应该按以下顺序看到条目(我明确显示了空字节字符串终止符:

fileListTemp[0]->d_name == ".\0"
fileListTemp[1]->d_name == "..\0"
fileListTemp[2]->d_name == "AnotherFile.txt\0"
fileListTemp[3]->d_name == "FirstFile.txt\0"
fileListTemp[4]->d_name == "ThirdFile.txt\0"

因此 fileListTemp 指向一 block 已分配的内存,其中包含五个 struct dirent 指针。五个 struct dirent 指针中的每一个都指向一个 struct dirent 分配内存块,其中包含一个空终止目录d_name 成员中的条目名称。 (即使这样也是一种简化,因为 d_name 条目也是一个指针,但它指向分配 block 尾端的额外分配空间,条目名称存储在那里。)

那是 六个 block 已分配的内存。

您可以使用分配的内存直到用完它,然后在数组中的每个条目上调用 free(),然后调用数组本身的 free()。

您必须释放每个条目以及数组本身。它们都是独立分配的内存块。

完成列表后,您应该:

for (int i = 0; i < noOfFiles; i++)
{
free(fileListTemp[i];
}

free(fileListTemp);

关于c - 如何在 c 中正确使用 scandir()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18402428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com