在 Debian(或任何 Linux)上调用 readdir 返回空指针,通常有下面几种原因,按出现频率从高到低说明:
readdir 的参数必须是 已成功打开的 DIR *,否则很容易出现“空指针”或段错误。
DIR *dir = opendir("/some/path");
if (dir == NULL) {
perror("opendir");
return;
}
❌ 错误示例:
DIR *dir = NULL;
readdir(dir); // 未打开目录
✅ 检查点:
opendir 是否返回 NULLreaddir 在读到目录结尾时返回 NULL,这不是错误。
struct dirent *entry;
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
// 这里 entry == NULL 是正常的
⚠️ 很多人误以为:
“readdir 返回 NULL = 出错”
其实:
NULL + errno == 0 → 目录结束NULL + errno != 0 → 真正出错判断是否出错:
errno = 0;
entry = readdir(dir);
if (entry == NULL && errno != 0) {
perror("readdir");
}
在 Debian 服务器场景中常见:
rm -rf此时:
opendir 成功readdir 突然返回 NULLerrno 可能是 ENOENTclosedir(dir);
readdir(dir); // 危险,可能返回 NULL 或崩溃
Debian 不同版本(如 Debian 10 / 11 / 12)glibc 行为一致,但:
可能导致 struct dirent 定义不匹配,间接表现为空指针。
例如:
entry = readdir(dir);
free(entry); // ❌ readdir 返回的是静态内存,不能 free
entry = NULL;
strace ./your_program
或:
#include <errno.h>
#include <string.h>
errno = 0;
entry = readdir(dir);
if (!entry) {
if (errno)
fprintf(stderr, "readdir error: %s\n", strerror(errno));
else
printf("end of directory\n");
}
Debian 上
readdir返回空指针,通常不是 bug,而是:目录读完 / 目录打不开 / 目录已不存在。
如果你愿意,可以把代码片段 + Debian 版本 + 报错现象贴出来,我可以直接帮你定位是哪一条。