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
相关产品推荐
相关产品推荐

