我正在尝试在Xcode中编译和运行测试C程序。该程序从文本文件中读取5个符号并将其关闭。程序构建成功,但是当我尝试运行程序时,我收到错误:GDB:程序收到信号:fclose(in)周围的“EXC_BAD_ACCESS”。
#include <iostream>
#include <unistd.h>
int main (int argc, const char * argv[])
{
bool b;
char inpath[PATH_MAX];
printf("Enter input file path :\r\n");
std::cin >> inpath;
FILE *in = fopen(inpath, "r+w");
char buf[5];
fread(&buf,sizeof(buf),5,in);
printf(buf);
fclose(in);
return 0;
}
这可能是什么原因?
答案 0 :(得分:3)
啊! sizeof(buf)
将返回5,因此您要求在5字节缓冲区中使用25个字节。这会覆盖自动存储和clobbers in
。
当然,请注意fprint(buf)
将尝试打印一个没有终止空值的缓冲区,因此它将在读取结束之后打印垃圾。
答案 1 :(得分:2)
该行
fread(&buf,sizeof(buf),5,in);
错误:请仔细阅读man page of fread(并记住sizeof(buf)
将是整个buf
数组的大小。
该行
printf(buf);
错了。如果例如buf
包含%d
您肯定应该学习使用调试器(并使用编译器启用所有警告)。
答案 2 :(得分:2)
fread(&buf,sizeof(buf),5,in);
这表示您想要阅读buf
5次,这是不正确的。
第二个和第三个参数告诉fread
您想要阅读的每个元素的大小以及元素的数量。