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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:49:42