堆被破坏
堆被损坏?
下面这一小段程序取自我读取一个BMP文件的代码。让他加载8位的文件,却总是异常终止。并且,VS提示:堆被损坏。
程序每次结束的地点就在这个地方。每次的输出结果到了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个字节)
下面这一小段程序取自我读取一个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个字节)