在fread()中的Segfault

时间:2011-03-24 10:39:49

标签: c segmentation-fault fread

我正在尝试使用C读取BMP图像(灰度),将值保存到数组中,并将此数组转换为字符串,其值以逗号分隔。

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

我有1,750张图片需要阅读,我想将它们全部存储在一个字符串中。

当我启动我的程序时它会一直运行到509:s图像,然后我得到由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);

    }

由于

4 个答案:

答案 0 :(得分:1)

你从哪里得到101376?每个字节最多占用5个字符作为带逗号的十进制数字(例如-127,),5*26368131840

答案 1 :(得分:1)

将其设为tmp[4];三位数,终止0。 另外:fclose在哪里?我怀疑你的文件句柄用完了。 检查是否fp != 0

答案 2 :(得分:0)

摆脱malloc电话中的演员阵容。并#include <stdlib.h>

在您使用的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;
}

答案 3 :(得分:0)

  1. 在调试器中运行程序。

  2. 在调用时设置断点 恐惧 - 以条件为条件 k == 507(当你离开时,这将停止它 期待恐惧成功)。

  3. 当程序点击时 断点,检查变量 并检查将要通过的内容 恐惧第一次或两次 你达到了断点,价值观 会很好。

  4. 然后在第509次,你会 可能会看到传递的伪造价值 恐惧找出那些 假的价值来自 - 可能设置一个条件 正在设置的变量的断点 无论虚假价值如何。