C语言问题:strdup无法正确将文件名存入结构体数组
解决目录文件名存储到结构体数组时的损坏问题
听起来你遇到的这个问题很典型——目录遍历和字符串复制时的内存/边界问题经常会导致这种奇怪的现象。我帮你拆解几个最可能的原因和对应的修复方案:
1. 未过滤.和..特殊目录项
readdir默认会返回当前目录(.)和上级目录(..)的条目,如果你没跳过它们,不仅会引入不需要的内容,还可能误遍历到上级目录,读到你提到的可执行文件,甚至干扰后续的数组存储逻辑。
修复示例代码:
// 定义存储文件名的结构体 struct FileInfo { char* filename; }; // 根据实际需求调整数组大小 struct FileInfo file_array[100]; int file_count = 0; DIR* target_dir = opendir("/path/to/your/target/dir"); if (!target_dir) { perror("Failed to open directory"); return 1; } struct dirent* entry; while ((entry = readdir(target_dir)) != NULL) { // 跳过当前和上级目录 if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) { continue; } // 检查数组是否还有剩余空间,避免越界覆盖 if (file_count >= sizeof(file_array)/sizeof(file_array[0])) { fprintf(stderr, "数组空间不足,无法存储更多文件\n"); break; } // 使用strdup复制文件名,同时检查内存分配是否成功 file_array[file_count].filename = strdup(entry->d_name); if (!file_array[file_count].filename) { perror("Failed to duplicate filename"); // 内存分配失败时,释放已分配的内存避免泄漏 for (int i = 0; i < file_count; i++) { free(file_array[i].filename); } closedir(target_dir); return 1; } file_count++; } closedir(target_dir);
2. 数组越界或strdup内存问题
- 如果你的结构体数组大小不足以容纳所有文件,写入超出范围的元素会覆盖其他内存区域,导致前面的条目出现乱码(奇怪符号),一定要在存储前检查数组剩余空间。
strdup底层依赖malloc,如果内存分配失败会返回NULL,如果没处理这个情况,后续访问NULL指针会触发未定义行为,表现为各种奇怪的错误。
3. 结构体指针未初始化
如果你的结构体数组里的filename指针没有初始化为NULL,未被赋值的元素可能会指向随机内存地址,看起来像是“损坏”的文件名。建议在使用前先初始化数组:
// 将数组内所有指针初始化为NULL memset(file_array, 0, sizeof(file_array));
4. 别忘了释放内存
程序结束前,记得释放strdup分配的内存,避免内存泄漏:
for (int i = 0; i < file_count; i++) { free(file_array[i].filename); }
你可以先重点检查跳过.和..的逻辑,以及数组边界的检查,这两个是引发这类问题最常见的诱因。
内容的提问来源于stack exchange,提问作者N. Adams
相关产品推荐
相关产品推荐

