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

C语言读取文件程序运行报指令引用内存无法读取错误如何解决

错误含义

该报错是内存访问违例,程序尝试访问地址为0x0000000000000006的受保护内存,这段内存不属于程序的合法可访问区间,因此系统强制终止了程序。

问题根因

你的代码存在两处核心问题:

  • 未校验fopen的返回值:如果文件名输入错误、目标文件不存在、程序无对应读取权限,fopen会返回NULL。后续fgetc接收空指针作为入参时,就会尝试访问NULL偏移的内存区域,触发本次报错。就算你确认传入了代码自身的文件名,也可能因为运行时工作目录不匹配、文件名拼写错误导致文件打开失败。
  • feof使用逻辑错误:feof仅会在文件读取操作失败后才返回真值,你使用的do-while结构会先执行一次读操作再判断是否到文件末尾,哪怕文件打开成功,最后也会多输出一次值为-1的EOF标记,属于逻辑漏洞。
修复方案

你可以直接使用如下修复后的代码:

#include <stdio.h>
int main (int argc,char **argv)
{
    // 先校验是否传入了文件名参数
    if (argc < 2) {
        printf("错误:请传入要读取的文件名作为运行参数\n");
        return 1;
    }
    FILE *f = fopen(argv[1], "r");
    // 校验文件是否打开成功
    if (f == NULL) {
        printf("错误:文件[%s]打开失败,请检查路径和权限\n", argv[1]);
        return 1;
    }
    int c;
    // 调整读取逻辑:读到EOF就直接终止循环
    while((c = fgetc(f)) != EOF)
    {
        printf("%c", c);
    }
    // 关闭文件释放资源
    fclose(f);
    return 0;
}

修复后代码新增了参数校验、文件打开结果校验,同时修正了文件读取逻辑,避免非法内存访问和多余的EOF输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:24:04