我正在尝试使用 scandir 初始化函数内的结构。我想将目录中的所有文件存储到一个数组中,并对它们执行一些操作。
void main() {
struct dirent **list;
int n = read("/home/user", list);
print(list, n);
free(list);
}
int read(char *path, struct dirent **foo) {
int n = scandir(path, &foo, 0, alphasort);
return 0;
}
void print(struct dirent **foo, int n) {
int i = 0;
for (i = 0; i < n; i++){
struct dirent *entry;
entry = nameList[i];
printf("%s\n", entry->d_name);
free(entry);
}
}
为什么read(char*, struct dirent**)
会导致段错误
?
当我构建它时它没有给出任何错误,我在这里有点迷失。
最佳答案
int scandir(const char *dirp, struct dirent ***namelist,
int (*filter)(const struct dirent *),
int (*compar)(const struct dirent **, const struct dirent **));
scandir 接受指针到指针的指针,但在函数中
int read(char *path, struct dirent **foo) {
int n = scandir(path, &foo, 0, alphasort);
return 0;
}
您正在将本地指针的地址传递给指针。改为传递指针地址:
int read(char *path, struct dirent ***foo) {
int n = scandir(path, foo, 0, alphasort);
return 0;
}
void main() {
struct dirent **list;
int n = read("/home/user", &list);
print(list, n);
free(list);
}
此外:
scandir() 函数返回所选目录条目的数量。出错时,返回-1,并设置 errno 来指示错误原因。
因此,如果您希望打印任何内容并在 main 中处理错误,则应该更改读取函数:
int my_read(char *path, struct dirent ***foo)
{
return scandir(path, foo, 0, alphasort);
}
在 main() 中:
int n = read("/home/user", &list);
if (n < 0)
{
perror("scandir failed");
exit(EXIT_FAILURE);
}
关于c - struct dirent **foo 到函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34800286/