You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 06:57:45