首页 > 解决方案 > scandir() 的第二个参数是什么?

问题描述

我有一个程序,我正在尝试使用 scandir(),但遇到了一个问题,这给我带来了一些问题。

根据 scandir() 的手册页,该函数接受一个指向 dirent 结构的“三重指针”:

int scandir(const char *dirp, struct dirent ***namelist,
              int (*filter)(const struct dirent *),
              int (*compar)(const struct dirent **, const struct dirent **));

但是,该页面还提供了以下示例:

#define _DEFAULT_SOURCE
       #include <dirent.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(void)
       {
           struct dirent **namelist;
           int n;

           n = scandir(".", &namelist, NULL, alphasort);
           if (n == -1) {
               perror("scandir");
               exit(EXIT_FAILURE);
           }

           while (n--) {
               printf("%s\n", namelist[n]->d_name);
               free(namelist[n]);
           }
           free(namelist);

           exit(EXIT_SUCCESS);
       }

请注意,他们声明了一个名为namelist的指针,并在 scandir() 中使用了“address-of”运算符。

我假设这会以某种方式将其变成“三重指针”?希望有人可以用图表或其他东西解释这里发生了什么。我将不胜感激。

标签: c

解决方案


&在C++中的声明中表示“引用”。由于这既不是 C++ 也不是声明,因此无关紧要。

但在表达式中,它是一元地址运算符(或二进制位与运算符)。

从类型的角度来看,获取某物的地址只是将(另一个)添加*到类型中。因此, a 的地址struct dirent **确实具有 type struct dirent ***


推荐阅读