c语言读文件遇到的一个很奇怪问题:文件读取时文件指针突然变成一个无效地址

lawen-y 2016-07-29 02:43:38
用c写了一段读文件的代码。文件中数据量已知,每条记录按固定字节数存储,在读到第三条(反正前几条)时文件指针就变成了一个无效值。由于不太方便贴出代码,但是大致如下:

int readfile()
{
FILE*fp;
int k = 0;
char buff[1024]={0};
fp = fopen("filename","r");
if(fp==NULL)
return 0;
while(k<10 && !feof(fp)) //这里由于记录条数是已知,我这里就直接写成10
{
fread(buff,1023,1,fp);
//这里有一些无关fp 和k 的处理代码
k++;
}
fclose(fp);
fp = NULL;
return 0;
}

问题:在读入前几条后,出现段错误,通过core文件发现是fclose关闭的文件指针有问题。
通过gdb 调试,发现在读前几条数据后,上面k 突然变成一个很大的值(8位数,看上去像一个地址),fp指针变成了和刚开始打开文件不一样的地址,变成了一个无效地址,导致fclose失败,段错误。(注:不存在多线程,打开的文件不存在在读取时候被删除的情况)

不知道大家有没有遇到这种情况,以前没遇到过这种问题,不知道大家有什么解决办法?多谢了!
[/size]
...全文
561 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fasdfsdgf 2016-07-29
  • 打赏
  • 举报
回复
可以改成strncat,如果为了拼接字符串可以用sprintf
lawen-y 2016-07-29
  • 打赏
  • 举报
回复
找到问题了,中间处理代码使用strcat出了点问题,应该是和结尾字符有关,导致内存越界,感谢上面两位解答。多谢!
小灸舞 版主 2016-07-29
  • 打赏
  • 举报
回复
越界不一定是fread那句导致的,也可能是你的别的变量越界导致的
你可以把别的语句都注释掉,就光光fread,然后fclose看看有没有问题
lawen-y 2016-07-29
  • 打赏
  • 举报
回复
引用 2 楼 qq423399099 的回复:
你这个肯定是有变量越界了,覆盖到k变量甚至是fp文件指针所在的内存。 极有可能是你fread(buff,1023,1,fp);后面的语句造成的,建议楼主自己检查下,或者贴出来。
每条记录长度固定,绝对小于1023,。变量越界指的是数据超出了变量的表示范围?
lawen-y 2016-07-29
  • 打赏
  • 举报
回复
引用 1 楼 CharlesSimonyi 的回复:
估计是向数组写入数据时越界了。 用GDB 设置一个watch point 监视fp,这样一旦fp被改变便可以断下来看是哪里出了问题
前面忘记说了,数据量是固定的,每条记录绝对小于1023
小灸舞 版主 2016-07-29
  • 打赏
  • 举报
回复
你这个肯定是有变量越界了,覆盖到k变量甚至是fp文件指针所在的内存。
极有可能是你fread(buff,1023,1,fp);后面的语句造成的,建议楼主自己检查下,或者贴出来。
encoderlee 2016-07-29
  • 打赏
  • 举报
回复
估计是向数组写入数据时越界了。 用GDB 设置一个watch point 监视fp,这样一旦fp被改变便可以断下来看是哪里出了问题

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧