Debian 下 readdir 内存管理要点

一 核心原则
二 常见误区与正确做法
三 代码示例
#include <stdio.h>#include <stdlib.h>#include <dirent.h>int main(int argc, char *argv[]) {const char *path = argc > 1 ? argv[1] : ".";DIR *dir = opendir(path);if (!dir) { perror("opendir"); return EXIT_FAILURE; }struct dirent *entry;while ((entry = readdir(dir)) != NULL) {// 直接使用 entry->d_name;不要 free(entry)printf("%sn", entry->d_name);}closedir(dir);return EXIT_SUCCESS;}#include <stdio.h>#include <stdlib.h>#include <string.h>#include <dirent.h>int main(int argc, char *argv[]) {const char *path = argc > 1 ? argv[1] : ".";DIR *dir = opendir(path);if (!dir) { perror("opendir"); return EXIT_FAILURE; }struct dirent *entry;while ((entry = readdir(dir)) != NULL) {char *name_copy = strdup(entry->d_name);if (!name_copy) { perror("strdup"); continue; }// 使用 name_copyprintf("copy: %sn", name_copy);free(name_copy);// 关键:释放你自己的拷贝}closedir(dir);return EXIT_SUCCESS;}#include <stdio.h>#include <stdlib.h>#include <dirent.h>int main(int argc, char *argv[]) {const char *path = argc > 1 ? argv[1] : ".";struct dirent **namelist = NULL;int n = scandir(path, &namelist, NULL, alphasort);if (n < 0) { perror("scandir"); return EXIT_FAILURE; }for (int i = 0; i < n; i++) {printf("%sn", namelist[i]->d_name);free(namelist[i]);// 先释放每个条目}free(namelist); // 再释放数组本身return EXIT_SUCCESS;}以上示例体现了:对 readdir 的条目指针不要 free,对你自己分配的副本或 scandir 的结果按规则释放。
四 处理大目录与性能建议
五 排查清单