堆被破坏

堆被损坏?
本帖最后由 u011496161 于 2013-11-02 01:48:01 编辑
下面这一小段程序取自我读取一个BMP文件的代码。让他加载8位的文件,却总是异常终止。并且,VS提示:堆被损坏。

    #ifdef _DEBUG_
    printf("BITMAPINFOHEADER has been successfully loaded.\n");
    #endif // _DEBUG_
        size_t v;
v=nDIBInfo->nColoursInPalette;
if(nDIBInfo->bitsPerPixel<=8){
        if((oColourTable=malloc(v==0?1<<nDIBInfo->bitsPerPixel:v))\
==NULL)
            return NULL;
fseek(ifBmpfile,54l,SEEK_SET);
fread(oColourTable,(v==0?1<<nDIBInfo->bitsPerPixel:v),4u,ifBmpfile); //
#ifdef _DEBUG_
printf("The colour table has been successfully loaded.\n");
        {
            size_t t1;
            size_t t2;
            size_t v1;
            unsigned char *p;
            p=oColourTable;
            v1=(v==0?1<<nDIBInfo->bitsPerPixel:v);
            printf("Data in colour table, %u in total:\n",v1);
            /*程序可能在这里终止*/
            for(t1=0;t1<v;t1++){
                printf("R:%d\t",p[0]);
                printf("G:%d\t",p[1]);
                printf("B:%d\t",p[2]);
                printf("Res:%d\n",p[3]);
                p+=4;
            }

}
#endif // _DEBUG_
    }
    /*dWidth在这段程序里面没用……*/
    dWidth=(((uwint32_t)nDIBInfo->bitmapWidth)*nDIBInfo->bitsPerPixel)/8;
    /*程序也可能在这终止*/
    if((oPixelArray=(char *)malloc(nDIBInfo->imageSize))==NULL)/*还可以在这里终止*/
        return NULL;
 
程序每次结束的地点就在这个地方。每次的输出结果到了Data in colour table, %u in total便停了。之后就是异常终止。另外每次程序停下的地点都不一样,就是上面注释所处的地方中的任何一个。
我猜想可能是加载调色板时候出错了,不过没看出错误啊…………望指教。
这个时候的堆栈状态:
> msvcr100d.dll!_read_nolock(int fh, void * inputbuf, unsigned int cnt)  行 230 + 0x2e 字节 C
  00ffffff()

------解决方案--------------------
1.分配空间
oColourTable=malloc(v==0?1<<nDIBInfo->bitsPerPixel:v)
应该为
oColourTable=malloc((v==0?1<<nDIBInfo->bitsPerPixel:v)*4)
因为你从文件读取数据时,需要这么大的空间;
2.读取文件
fread(oColourTable,(v==0?1<<nDIBInfo->bitsPerPixel:v),4u,ifBmpfile);
应改为
fread(oColourTable,4u,(v==0?1<<nDIBInfo->bitsPerPixel:v),ifBmpfile);
且应判断返回值个数:应等于(v==0?1<<nDIBInfo->bitsPerPixel:v)

3.循环
for(t1=0;t1<v;t1++)
应改为
for(t1=0;t1<v1;t1++)
因为p中具有v1个元素(每个元素具有4个字节)