关于字节对齐问题

2019-07-13 06:36发布

今天在进行嵌入式移植某个算法时,移植之前,我按照惯例,先把程序在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 ()