C语言读取每行含1字节十六进制值的文本文件时出现段错误求助
C语言读取每行含1字节十六进制值的文本文件时出现段错误求助
兄弟,看你代码写到一半就卡住了(buf[1L<<这明显是没写完的语法),结合你描述的场景,我来给你捋捋大概率会导致段错误的坑,再给你一个能正常跑的示例代码,帮你解决问题!
先说说你原代码里可能触发段错误的几个致命问题:
- 数组定义非法:你写的
char buf[1L<<完全是语法错误,就算编译器没直接报错,生成的程序里这个数组的大小是非法的,后续访问buf的时候直接越界踩栈,必然触发段错误。 - 未初始化的指针:你定义了
char* file_path;但没给它赋值,直接用这个指针的话,它会指向内存里的随机地址,访问这种地址十有八九会崩。 - 没检查文件是否打开成功:如果传入的文件路径不存在、权限不够,
fopen会返回NULL,后续直接对NULL指针做读写操作,肯定触发段错误。 - 格式符使用错误:如果用
fscanf读取uint8_t类型,直接用%x会导致类型不匹配,可能破坏栈上的其他变量,间接引发段错误。
给你一个能正常工作的示例代码
假设你的文本文件每行是一个单字节十六进制值(比如每行是AA),或者是空格分隔的多个单字节十六进制(比如AA BB CC),这个代码都能正确读取:
#include <stdio.h> #include <stdint.h> #include <stdlib.h> int main(int argc, char *argv[]) { // 先检查是否传入了文件路径 if (argc != 2) { fprintf(stderr, "用法: %s <要读取的文件路径>\n", argv[0]); return EXIT_FAILURE; } // 打开文件,必须检查是否成功 FILE *fp = fopen(argv[1], "r"); if (fp == NULL) { perror("打开文件失败"); return EXIT_FAILURE; } uint8_t read_byte; // 用%hhx格式符专门读取uint8_t类型的十六进制值 // fscanf会自动跳过空格、换行等空白字符 while (fscanf(fp, "%hhx", &read_byte) == 1) { printf("读取到的字节: 0x%02X\n", read_byte); } // 检查是正常读到文件末尾,还是中途出错 if (!feof(fp)) { perror("读取文件时发生错误"); fclose(fp); return EXIT_FAILURE; } // 别忘了关闭文件 fclose(fp); return EXIT_SUCCESS; }
额外的排查小技巧
如果之后还遇到段错误,推荐用gdb来定位:
- 编译的时候加上
-g参数(比如gcc your_code.c -g -o hex_reader) - 运行
gdb ./hex_reader,然后输入run 你的文件路径触发错误 - 输入
bt就能看到完整的调用栈,直接定位到出错的代码行,一目了然。
备注:内容来源于stack exchange,提问作者miner_kai
相关产品推荐
相关产品推荐

