【问题标题】:Process exited with return value 3221225477进程退出,返回值 3221225477
【发布时间】:2014-06-08 12:27:08
【问题描述】:

我正在写这段代码:

#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int i;
fp = fopen("keimeno.txt","r");
fscanf(fp,"%d",i);
printf("%d\n",i);
    fclose(fp);
return 0;
}

文件包含:

2
Yiannis Ioannou 356
3
Today
10347
If
345
And then none
1542
John Smith 743
2
My story
3940
Feedback
682
END

当我尝试运行它时,它会退出我的值 3221225477 而不是打印数字 2..

谁能解释一下原因?

【问题讨论】:

  • 仅供参考:十六进制的返回值为 0xC0000005 或 STATUS_ACCESS_VIOLATION。

标签: c


【解决方案1】:

当你扫描一个数字时,你需要传递你想要存储结果的变量的地址:

fscanf(fp,"%d",&i);

你在哪里

fscanf(fp,"%d",i);
               ^  missing the & sign!

你的编译器真的应该警告你——你编译时是否启用警告?

这里发生的是fscanf 函数写入给定的位置(在您的情况下,它写入 指向的任何位置i,而不是写到i位置)。这可能会以各种令人讨厌的方式破坏您的记忆 - 在您的情况下,导致程序在崩溃之前“运行”了相当长的时间。

正如@Brandin 指出的那样,您的代码还有一个问题(尽管它不太可能成为问题的根源)。当您尝试打开文件时,您应该始终检查您是否成功。你可以这样做:

#include <assert.h>
// at the top of the program


// attempt to open the file:
fp = fopen("keimeno.txt","r");
// and check whether you succeeded:
assert(fp != NULL); // this says "check fp is not NULL. Otherwise, quit."

或者,您可以通过以下方式使事情变得更漂亮:

const char *fileName = "keimeno.txt";
const char *mode = "r";
if((fp=fopen(fileName, mode))==NULL) {
  printf("cannot open file %s\n", fileName);
  return -1;
}

将“硬连线值”放在程序开头附近几乎总是一个好主意,而不是将它们嵌入到函数调用中。

【讨论】:

  • 除此之外,OP应该检查fopen之后的返回值。假设它总是有效也很容易导致未定义的行为。
  • @Brandin 你是对的 - 但通常带有 NULL 指针的 fscanf 会给出更可预测的错误消息。我将更新我的答案以包含此信息。
  • 谢谢它的工作......这不是我的代码......在我的代码中我正在检查文件是否可以打开
  • 如果您在发布模式下编译(例如定义了NDEBUG),使用assert 测试是否成功将不起作用。正确的方法是使用 if 语句,如示例所示。
  • @Brandin - 我假设任何将文件路径硬连接到当前目录的人都在调试模式下工作,而不是发布模式。但是您的观点(再次)有效-谢谢。您认为值得从答案中删除 assert 方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 2016-07-24
  • 2022-01-06
  • 2016-08-11
相关资源
最近更新 更多