【问题标题】:Program to print file contents unable to run, returns "Instruction at <address> referenced memory at <address>" error打印文件内容的程序无法运行,返回“<address> 处的指令引用 <address> 处的内存”错误
【发布时间】:2021-12-29 08:39:43
【问题描述】:

我正在从一本书中学习 C 语言。 我已经读到了书中关于文件和命令行参数的部分,但现在我被这段代码卡住了:

#include <stdio.h>
int main (int argc,char **argv)
{
    FILE *f=fopen(argv[1],"r");
    int c;
    do
    {
        c=fgetc(f);
        printf("%c",c);
    }
    while(!feof(f));
}

当我运行它时(参数是代码自己的用于测试的文件名),出现error message

0x0000000000401474 处的指令引用了 0x0000000000000006 处的内存。无法读取内存。单击确定以终止程序。点击CANCEL调试程序。

这个错误是什么意思,如何解决?

【问题讨论】:

  • 在调用fopen 后始终检查f。在访问 argv[1] 之前,请务必检查 argc &gt;= 2。请注意,“参数是代码自己的文件名” 无论如何都是argv[0]
  • 如果文件是二进制文件(不是文本文件),那么printf("%d ",c); 会更有用。
  • 我为误解道歉,@WeatherVane,我所说的“代码自己的文件名”是指未编译的 C 代码保存在一个名为“tutorial.c”的文件中,我编译了代码并使用fileopen tutorial.c 运行可执行文件
  • 无法重现,但我作为参数提供的文件确实存在于默认文件夹中。检查argc和检查f
  • 非常感谢您的 cmets @Weather Vane,我的代码现在可以工作了。

标签: c file command-line memory-address fault


【解决方案1】:

你需要检查文件指针是否不为 NULL 之类的

if (f == NULL) {
    return EXIT_FAILURE;
}

此外,文件使用完毕后需要关闭。

fclose(f);

【讨论】:

  • 非常感谢您的建议@Ada Lovelace,我已经实现了这两个并且代码现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多