回 帖 发 新 帖 刷新版面

主题:有一个内存方面的问题请教大家,请大家帮忙看一下。谢谢

这是在DOS下的TC环境中的BMP图片显示的一个函数。
现在有个问题,这个软件是在PC104    的DOS环境下跑的,但是图片在显示10次之后,就会发生软件死机跑飞现象。
怀疑是由内存引起的。请大家看下这样申请和释放内存正确吗?

void DisplayBMP()
{
    long i,j;
    long WBytes;
    int Colors;
    long Height,Width;
    FILE *fpbmp;
    char *Temp=NULL;
    typedef struct tagBITMAPFILEHEADER
    {
        unsigned int bfType;
        unsigned long bfSize;
        unsigned int bfReserved1;
        unsigned int bfReserved2;
        unsigned long bfOffBits;
    }BITMAPFILEHEADER;

    typedef struct tagBITMAPINFOHEADER
    {
        unsigned long biSize;
        long biWidth;
        long biHeight;
        unsigned int biPanes;
        unsigned int biBitCount;
        unsigned long biCompression;
        unsigned long biSizeImage;
        long biXPelsPerMeter;
        long biYPelsPerMeter;
        unsigned long biClrUsed;
        unsigned long biClrImportant;
    }BITMAPINFOHEADER;

    typedef struct tagRGBQUAD
    {
        unsigned char rgbBlue;
        unsigned char rgbGreen;
        unsigned char rgbRed;
        unsigned char rgbReserved;
    }RGBQUAD;

    typedef struct tagBITMAPINFO
    {
        BITMAPINFOHEADER bmiHeader;
        RGBQUAD bmiColors[];
    }BITMAPINFO;

    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;
    unsigned char SrcData,data;
    if((fpbmp=fopen("Rochen.bmp","rb"))==NULL)
    {
            /*Exit("Can Not Open The File.\n");*/
    }
    fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpbmp);
    if(bfh.bfType!='M'*256+'B')
    {
            /*Exit("This Is Not A Bmp File.\n");*/
    }
    fread(&bih,sizeof(BITMAPINFOHEADER),1,fpbmp);
    Height=bih.biHeight;
    Width=bih.biWidth;
    WBytes=WidthBytes(Width,bih.biBitCount);
    Colors=1<<bih.biBitCount;
    if(!(Colors==16||Colors==2))
    {
            /*Exit("This Programme Only For 16 Colors Bitmap.\n");*/
    }
    /*Temp = calloc(10, sizeof(RGBQUAD));*//*申请颜色内存*/
    Temp = (RGBQUAD *)malloc(Width*sizeof(RGBQUAD));  /*申请内存空间*/
    fread(Temp,sizeof(RGBQUAD),Colors,fpbmp);
    /*printf("%d %d",'\f','\t');*/
    for(i=Height-1;i>=0;i--)
    {
         fseek(fpbmp,54+Colors*sizeof(RGBQUAD)+i*WBytes,SEEK_SET);
         for(j=MOVEX;j<Width+MOVEX;j++)/*图片X轴方向起始坐标*/
         {
           switch(Colors)
           {
               case 16:
                             if(j%2==0)
                             {
                                        fread(&SrcData,1,1,fpbmp);
                                        data=SetPalette(Colors,SrcData/16);
                                        putpixel(j,Height-1-i+MOVEY,data);/*图片Y轴方向起始坐标*/
                             }
                             else
                             {
                                        data=SetPalette(Colors,SrcData%16);
                                        putpixel(j,Height-1-i+MOVEY,data);
                             }
                             break;
               case 2:
                             if(j%8==0)
                             {
                                        fread(&SrcData,1,1,fpbmp);
                                        data=SetPalette(Colors,(SrcData>>7)%2);
                                        putpixel(j,Height-1-i+MOVEY,data);
                             }
                             else
                             {
                                        data=SetPalette(Colors,(SrcData>>(7-j%8))%2);
                                        putpixel(j,Height-1-i+MOVEY,data);
                             }
           }
         }
    }
    /*getch();*/
  free(Temp);/*释放掉颜色内存*/
  close(fpbmp);  /*关闭文件*/
}

回复列表 (共1个回复)

沙发

分配内存只有这里一处:
    Temp = (RGBQUAD *)malloc(Width*sizeof(RGBQUAD));  /*申请内存空间*/
    fread(Temp,sizeof(RGBQUAD),Colors,fpbmp);

这两行代码,如果Colors大于Width,则内存越界。另外,Temp这个变量好象没有使用,不知道为什么要分配这个内存。
注意内存问题不一定是分配和释放问题,也可能是内存越界访问。楼主不妨仔细检查一下SetPalette和putpixel两个函数,看看是否存在内存越界。

看得比较粗略,暂时没有发现别的问题,楼主见谅。

我来回复

您尚未登录,请登录后再回复。点此登录或注册