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
相关产品推荐
相关产品推荐

