c - 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++ 也不是声明,因此无关紧要。
但在表达式中,它是一元地址运算符(或二进制位与运算符)。
从类型的角度来看,获取某物的地址只是将(另一个)添加*
到类型中。因此, a 的地址struct dirent **
确实具有 type struct dirent ***
。
推荐阅读
- excel - 获取和比较字符串中的整数
- javascript - jQuery .load() 函数后,jQuery sortable() 不起作用
- node.js - 修改 server.js 以使用 heroku 部署处理 api 调用
- google-drive-api - Google Drive API - 转移整个驱动器的所有权(如网络界面)
- angular - ng-template 内容不会在 Angular 中使用引导工具提示的 title 属性内呈现
- vba - 运行时错误“3265”:在此集合中找不到项目。Access 中的 VBA 模块
- sql - 使用 @Formula(休眠注释)时无法提取 ResultSet
- python - 如何在异构列表和字典中使用递归
- javascript - 使用 jsonwebtoken 生成令牌并在 MERN 堆栈中的前端和后端之间传递令牌时出错
- python - CUDA 错误:使用 HuggingFace 训练 BERT 模型时出现 CUBLAS_STATUS_INVALID_VALUE 错误