今天在进行嵌入式移植某个算法时,移植之前,我按照惯例,先把程序在VS上修改成适合嵌入式linux的版本,我先在VS把linux中没有的头文件windows.h去掉以后,手动实现了一个程序里面需要用到的某个结构体BITMAPFILEHEADER,然后运行,程序竟然在loadImage(自己的API)的时候竟然就开始出错,src_img竟然是一个非常大的数,我经过断电排查,发现了一个bug,,,是有关于字节对齐的问题,由于我用的处理器默认的处理是按照四字节对齐的,所以结构体内的成员存储时都是按照"存放起始地址%N=0"
来存储的,,,所以导致我的用到的结构体的大小是16,而真正的大小应该是14。。。。真坑,果断在自己手动实现的结构体前面加了#pragma pack (2),使结构体按照windos.h中正确的2字节对齐来存储,结果运行正确。
#pragma pack (4)
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
DWORD bfSize;
}BITMAPFILEHEADER;//, *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;// , *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
#pragma pack ()