C fread()中的Segfault

C fread()中的Segfault,c,segmentation-fault,fread,C,Segmentation Fault,Fread,我正在尝试用C读取BMP图像(灰度标尺),将值保存到数组中,并将该数组转换为一个字符串,其中的值用逗号分隔 我的程序在64位Windows 7下运行良好,但由于库兼容性问题,我不得不改用32位Windows XP 我有1750个图像要读,我想把它们全部存储在一个字符串中 当我启动我的程序时,它会一直正常运行,直到第509张图像,然后我得到一个由fread()引起的分割错误。这是我的密码: int i=0,j,k,num,len,length,l; unsigned char *Buffer; F

我正在尝试用C读取BMP图像(灰度标尺),将值保存到数组中,并将该数组转换为一个字符串,其中的值用逗号分隔

我的程序在64位Windows 7下运行良好,但由于库兼容性问题,我不得不改用32位Windows XP

我有1750个图像要读,我想把它们全部存储在一个字符串中

当我启动我的程序时,它会一直正常运行,直到第509张图像,然后我得到一个由fread()引起的分割错误。这是我的密码:

int i=0,j,k,num,len,length,l;
unsigned char *Buffer;
FILE *fp;
char *string,*finalstring;
char *query;
char tmp2[5],tmp[3];
query = (char *)malloc(sizeof(char)*200000000);
string = (char *)malloc(sizeof(char)*101376);
Buffer = (unsigned char *)malloc(sizeof(unsigned char)*26368);
 BITMAPFILEHEADER bMapFileHeader;
BITMAPINFOHEADER bMapInfoHeader;
length = 0;


  for (k =1;k<1751;k++)
    {
    strcpy(link,"imagepath");
    //here just indexing the images from 0000 to 1750
    sprintf(tmp2,"%.4d",k);
    strcat(link,tmp2);
    strcat(link,".bmp");


       fp = fopen(link, "rb");
       num = fread(&bMapFileHeader,sizeof(BITMAPFILEHEADER),1,fp);
       num = fread(&bMapInfoHeader,sizeof(BITMAPINFOHEADER),1,fp);
    //seek beginning of data in bitmap
     fseek(fp,54,SEEK_SET);
    //read in bitmap file to data

    fread(Buffer,26368,1,fp);
    l=0;

    for(i=1024;i<26368;i++)
    {
      itoa(Buffer[i],tmp,10);
      len = strlen(tmp);
      memcpy(string+l,tmp,len);
      memcpy(string+l+len,",",1);
      l = l+len+1;

    }

    memcpy(query,"",1);
    memcpy(string,"",1);
    printf("%i\n",k);

    }
inti=0,j,k,num,len,length,l;
无符号字符*缓冲区;
文件*fp;
char*string,*finalstring;
字符*查询;
char-tmp2[5],tmp[3];
查询=(char*)malloc(sizeof(char)*200000000);
字符串=(char*)malloc(sizeof(char)*101376);
缓冲区=(无符号字符*)malloc(sizeof(无符号字符)*26368);
BITMAPFILEHEADER bMapFileHeader;
BitMapInfo标头bmapInfo标头;
长度=0;

对于(k=1;k您从何处获得
101376
?每个字节最多占用5个字符作为带逗号的十进制数字(例如
-127,
),
5*26368
131840
使其成为
tmp[4];
表示三位数字,终止为0。 另外:
fclose
在哪里?我怀疑您的文件句柄用完了。
检查
fp!=0
是否清除
malloc
调用中的强制转换。以及
#包括

在您使用的64位和32位系统中,这个程序的输出是什么

#include <stdio.h>
int main(void) {
    printf("sizeof (int) is %d\n", (int)(sizeof (int)));
    printf("sizeof (int*) is %d\n", (int)(sizeof (int*)));
    return 0;
}
#包括
内部主(空){
printf(“sizeof(int)是%d\n”,(int)(sizeof(int));
printf(“sizeof(int*)是%d\n”,(int)(sizeof(int*));
返回0;
}
  • 在调试器中运行程序

  • 在调用时设置断点 fread——使其有条件于 k==507(当您 期待fread的成功)

  • 当程序点击 断点,检查变量 并检查将要通过的内容 给弗瑞德,头一两次 当你碰到断点时,这些值 那就好了

  • 那么在第509次,你会 可能会看到传递了假值 去弗瑞德,看看那些东西在哪里 虚假价值来自于-- 可能设置一个条件 正在设置的变量上的断点 不管虚假价值是什么


  • 非常感谢,它实际上解决了我的问题,我不知道文件句柄用完了,我以为每次打开图像时都会初始化fp。在k循环结束时添加fclose(fp)解决了我的问题:)