free掉一个字符串地址时出现is_block_type_valid的报错
FileBuffer是在堆中申请的一块内存,我是用来接收文件的字符的。其中也确实接收到了我需要的内容,但是在free时出现了问题,且无法找到解决办法。希望各位能帮忙看看。
#pragma once
#include
#include
#include
#include
#include
#define WIDTHBYTES(bits) (bits+31)/32*4
#define T_SIZE(size) sizeof(TCHAR)*size
#define A_SIZE(size) sizeof(char)*size
#define FILEBUFFER 1024
//typedef struct tagBITMAPFILEHEADER
//{
// WORD bfType; // BMP图像固定为0x4d42
// DWORD bfSize;// 文件的大小
// WORD bfReserved1;
// WORD bfReserved2;
// DWORD bfOffBits;//实际位图数据的偏移
//}BITMAPFILEHEADER;
//typedef struct tagBITMAPINFOHEADER
//{
// DWORD biSize;//该结构体的大小,40byte
// LONG biWidth;//位图宽度,单位:像素
// LONG biHeight;//位图高度,单位:像素
// WORD biPlanes;//平面数,为1
// WORD biBitCount;//采用的颜色位数,即使用多少bit位表示颜色
// DWORD biCompression;//压缩方式,0表示不压缩
// DWORD biSizeImage;//实际位图占用的字节数,即数据区大小
// LONG biXPelsPerMeter;//X方向的分辨率
// LONG biYPelsPerMeter;//Y方向的分辨率
// DWORD biClrUsed;//使用的颜色数,为0时默认为2^biClrUsed
// DWORD biClsImportant;//重要颜色数目,为0时默认所有颜色重要
//}BITMAPINFOHEADER;
//
//typedef struct tagRGBQUAD
//{
// BYTE rgbBlue;//蓝色的亮度
// BYTE rgbGreen;//绿色的亮度
// BYTE rgbRed;//红色的亮度
// BYTE rbgReserved;
//}RGBQUAD;
void ShowBmpHead(BITMAPFILEHEADER bitHead)
{
printf("Bmp文件头信息:\n");
printf("\t位图文件头标志:0x%x\n", bitHead.bfType);
printf("\tBmp文件大小:%u\n", bitHead.bfSize);
printf("\tBmp保留字1:%u\n", bitHead.bfReserved1);
printf("\tBmp保留字2:%u\n", bitHead.bfReserved2);
printf("\tBmp实际位图数据的偏移地址:%u\n", bitHead.bfOffBits);
return;
}
int main(int argc, char* argv[])
{
setlocale(LC_ALL, "");
BITMAPFILEHEADER bitHead;
BITMAPINFOHEADER bitInfoHead;
HANDLE hFile;
DWORD Readed = 0;
LPTSTR FileName = (LPTSTR)_malloca(T_SIZE(MAX_PATH));
LPSTR FileBuffer = (LPSTR)malloc(A_SIZE(FILEBUFFER));
memset(FileName, 0, T_SIZE(MAX_PATH));
memset(FileBuffer, 0, A_SIZE(FILEBUFFER));
printf("请输入要解析的bmp文件:\n");
wscanf_s(L"%[^\n]", FileName, T_SIZE(MAX_PATH));
hFile = CreateFile(FileName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
printf("打开文件失败\n");
return -1;
}
BOOL Is = ReadFile(hFile, FileBuffer, 14, &Readed, NULL);
if (!Is)
{
printf("读取文件失败\n");
return -1;
}
bitHead.bfType = *(WORD*)FileBuffer;
if (bitHead.bfType != 0x4d42)
{
printf("不是BMP文件\n");
return -1;
}
bitHead.bfSize = *(DWORD*)(FileBuffer + sizeof(bitHead.bfType));
bitHead.bfReserved1 = *(WORD*)(FileBuffer + sizeof(bitHead.bfType) + sizeof(bitHead.bfSize));
bitHead.bfReserved2 = *(WORD*)(FileBuffer + sizeof(bitHead.bfType) + sizeof(bitHead.bfSize) + sizeof(bitHead.bfReserved1));
bitHead.bfOffBits= *(DWORD*)(FileBuffer + sizeof(bitHead.bfType) + sizeof(bitHead.bfSize) + sizeof(bitHead.bfReserved1) + sizeof(bitHead.bfReserved2));
ShowBmpHead(bitHead);
free(FileBuffer);
FileBuffer = NULL;
return 0;
}