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

C语言 码拜 8年前 (2016-05-16) 1159次浏览
用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]

解决方案

15

估计是向数组写入数据时越界了。
用GDB 设置一个watch point 监视fp,这样一旦fp被改变便可以断下来看是哪里出了问题

30

你这个肯定是有变量越界了,覆盖到k变量甚至是fp文件指针所在的内存。
极有可能是你fread(buff,1023,1,fp);后面的语句造成的,建议题主本人检查下,或贴出来。

20

越界不一定是fread那句导致的,也可能是你的别的变量越界导致的
你可以把别的语句都注释掉,就光光fread,然后fclose看看有没有问题

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明c语言读文件遇到的一个很奇怪问题:文件读取时文件指针突然变成一个无效地址
喜欢 (0)
[1034331897@qq.com]
分享 (0)