Linux下C语言读取二进制文件魔数报段错误该如何修复
问题修复方案
段错误的核心诱因是fopen打开文件失败返回空指针,后续直接对空指针执行fseek操作触发非法内存访问。
具体修复点
- 增加文件打开失败校验,避免空指针操作:需要判断
fp == NULL的情况,直接打印错误信息退出程序 - 修正文件路径:Linux系统下
/Documents是根目录下的路径,通常不存在,如果你要访问当前用户家目录下的Documents文件夹,需要补全用户名前缀,例如/home/xxx/Documents/OCP/lab1test/lab1call - 补充必要头文件:代码需要引入
<stdio.h>和<stdlib.h>,否则编译器会因找不到函数定义产生未定义行为 - 优化冗余逻辑:读取4字节魔数不需要申请整个文件大小的内存,直接使用栈上的4字节无符号字符数组即可,避免内存泄漏
修正后可运行代码
#include <stdio.h> #include <stdlib.h> int main() { FILE *fp; // 请把下面的路径替换为你实际的文件绝对路径 fp = fopen("/home/你的用户名/Documents/OCP/lab1test/lab1call", "rb"); // 新增空指针校验 if (fp == NULL) { perror("文件打开失败"); return EXIT_FAILURE; } unsigned char magic_number[4]; // 直接读取前4字节 fread(magic_number, sizeof(unsigned char), 4, fp); fclose(fp); printf("你的文件魔数为:\n"); printf("%02hhx %02hhx %02hhx %02hhx\n", magic_number[0], magic_number[1], magic_number[2], magic_number[3]); return EXIT_SUCCESS; }
内容的提问来源于stack exchange,提问作者Ivan Ivan
相关产品推荐
相关产品推荐

