c 语言 free指针时出现 is_block_type_valid

问题遇到的现象和发生背景

free掉一个字符串地址时出现is_block_type_valid的报错

用代码块功能插入代码,请勿粘贴截图
运行结果及报错内容

img

我的解答思路和尝试过的方法

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;
}