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

从文件读取65536行十六进制数据到数组时遇运行时检查失败#2

问题分析与解决方案

首先,你遇到的Run-Time Check Failure #2本质是栈上的temp变量缓冲区越界导致的栈破坏——虽然你看起来成功复制了所有数据,但fgets在写入temp时已经超出了它的分配空间,覆盖了栈上的其他关键数据,运行时的栈检测机制捕捉到了这个异常。

核心原因:temp缓冲区大小不足

每行是4位十六进制数字,实际写入文件的行通常还包含换行符(\n),再加上C字符串必须的终止符\0,一行的总长度是:
4位十六进制字符 + 1个换行符 + 1个终止符 = 6字节

如果你的temp定义得比这个小(比如char temp[5];),fgets会把超出的字节写到栈上的其他区域,直接破坏栈结构,触发运行时错误。

修复步骤

  1. 给temp分配足够的缓冲区
    建议直接定义一个足够大的缓冲区,留足余量避免边界问题,比如:

    char temp[10]; // 足够容纳4位十六进制+换行+终止符,甚至更长的异常行
    

    或者精确计算的话,至少定义为char temp[6];,但留余量更稳妥。

  2. 检查fgets的返回值
    别忽略fgets的返回结果,它会在读取失败或到达EOF时返回NULL,可以加个判断避免异常:

    while (fgets(temp, sizeof(temp), fp) != NULL) {
        // 处理转换逻辑
    }
    
  3. 验证十六进制转换的有效性
    用sscanf或strtol转换时,检查转换是否成功,确保每行都是有效的4位十六进制数,比如:

    int value;
    if (sscanf(temp, "%x", &value) == 1) {
        arr[index++] = value;
    } else {
        // 处理无效行的逻辑,比如打印错误信息
    }
    
  4. 考虑数组的内存分配方式
    65536个int的数组(256KB)如果是定义在栈上(比如int arr[65536];),虽然大部分情况下栈能容纳,但如果你的程序栈空间被其他变量占用较多,也可能间接引发栈问题。建议用动态分配更安全:

    int *arr = malloc(65536 * sizeof(int));
    if (arr == NULL) {
        // 处理内存分配失败的逻辑
    }
    // 使用完后记得free(arr);
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:35:37