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

C程序以char*值为文件名创建文件时返回坏文件描述符错误

问题:C语言随机文件名创建文件触发坏文件描述符错误

开发C语言程序实现随机文件名创建、打开文件功能时,预期代码可正常执行文件打开操作,实际运行时即便传入字符串类型文件名,程序依然返回*坏文件描述符(bad file descriptor)*错误,原实现代码如下:

#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE* newFile;
    char* newFilename = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26];
    printf("The file is: %i\n", newFilename);

    //Access file
    int n = open(newFilename, O_CREAT|O_WRONLY|O_TRUNC, 0777);
    newFile = fdopen(n, "wb");
    if(newFile == NULL) {
        printf("Error: %s\n", strerror(errno));
        return 1;
    }
    free(newFile);
}
错误原因

代码存在多处逻辑错误,直接触发报错的原因如下:

  • 文件名变量类型和赋值逻辑完全错误:char* newFilename = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random () % 26]; 这行代码取字符串常量中的单个char类型字符,强行赋值给char*类型的指针变量,最终得到的是一个指向非法内存地址的野指针,根本不是合法的文件名字符串。
  • 缺失系统调用返回值校验:open调用失败时会返回-1,代码未校验该返回值就直接传入fdopen,-1是非法文件描述符,必然触发bad file descriptor错误。
  • 格式化打印参数不匹配:用%i(整数格式符)打印char*类型的文件名,实际输出的是指针的内存地址数值,无法打印真实文件名,完全无法辅助调试。
  • 资源释放接口用错:fdopen返回的FILE*结构体指针必须用fclose关闭,直接调用free只会释放指针本身占用的内存,不会关闭底层文件描述符、刷新IO缓冲区,会造成资源泄漏,甚至触发未定义行为。
  • 头文件缺失:代码中用到printf、random、FILE结构相关接口,未引入<stdio.h>、<time.h>、<unistd.h>头文件,编译阶段就会出现隐式声明警告,运行时行为不可预期。
  • 未初始化随机数种子:直接调用random()不播种的话,每次程序运行生成的随机数序列完全固定,达不到随机文件名的效果。
修正后可运行代码
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <time.h>
#include <unistd.h>

int main() {
    FILE* newFile;
    // 单字符文件名需要2字节空间:1字节存字母,1字节存字符串结束符'\0'
    char newFilename[2];
    // 用当前时间初始化随机数种子
    srandom(time(NULL));
    newFilename[0] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[random() % 26];
    newFilename[1] = '\0';
    printf("The file is: %s\n", newFilename);

    // 校验open调用返回值
    int fd = open(newFilename, O_CREAT|O_WRONLY|O_TRUNC, 0777);
    if (fd == -1) {
        printf("Open file failed: %s\n", strerror(errno));
        return 1;
    }
    newFile = fdopen(fd, "wb");
    if(newFile == NULL) {
        printf("fdopen error: %s\n", strerror(errno));
        // fdopen打开失败需要手动关闭已经拿到的文件描述符
        close(fd);
        return 1;
    }

    // 此处写入文件操作逻辑

    // 用fclose正确关闭文件流
    fclose(newFile);
    return 0;
}

内容的提问来源于stack exchange,提问作者Programming Student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:19:07