larry, у тебя C используется ?
Если нет, вот вот это всё, только гораздо красивее 

А код рабочий - у меня всё выделяется
struct BITMAP_FILE_TAG
{
	private:
	BITMAPFILEHEADER bitmapfileheader;  // this contains the bitmapfile header
	BITMAPINFOHEADER bitmapinfoheader;  // this is all the info including the palette
	PALETTEENTRY     palette[256];      // we will store the palette here
	UCHAR            *buffer;           // this is a pointer to the data
	public:
	int LoadBitmapFile(const char* filename,HWND hWnd=0)
	{
		FILE* file=fopen(filename, "r");
		fread(&bitmapfileheader,sizeof(bitmapfileheader),1,file);
		fread(&bitmapinfoheader,sizeof(bitmapinfoheader),1,file);
		fseek(file,-(int)(bitmapinfoheader.biSize),SEEK_END);
		if(bitmapinfoheader.biBitCount == 24)
		{
			buffer = new UCHAR[bitmapinfoheader.biSizeImage];//<<<<<
			if(!buffer)
			{
				fclose(file);
				if(hWnd)
				{
					MessageBox(hWnd, _T("Память не выделена!"), _T("Ошибка"), 0);
				}
				return(-1);
			}
			fread(&buffer,sizeof(bitmapinfoheader.biSizeImage),1,file);
		}
		fclose(file);
		return(0);
	}
	void DeleteBuffer()
	{
		if(buffer)
		{
			delete buffer;
			buffer=0;
		}
	}
	~BITMAP_FILE_TAG()
	{
		DeleteBuffer();
	}
};