c - struct dirent **foo 到函数

标签 c function pointers struct

我正在尝试使用 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/

相关文章:

sql-server - 过程或函数指定的参数过多 SSRS

swift - 定时器只执行一次函数

python - 方程未显示在 Canvas 中

c++ - 指向模板参数类型的指针

c++ - 在另一个结构中初始化一个结构数组

c++ - 从命令行调用 Eclipse 的格式选项

c - 使用 static 关键字声明变量

arrays - 如何使用 while 循环将字符串值存储在数组的特定索引中

c - 如何将 5 放在 0 旁边 (5 + 0 = 50),而不是在 c 中仅添加 5+0=5?

c - 如何在运行时创建单链表并对其进行排序?