关于数组给给结构体赋值的问题

我下了如下一段程序:
typedef struct {
u8 BS_jmpBoot[3];
u8 BS_OEMName[8];
u16 BPB_BytesPerSec;
u8 BPB_SecPerClus;
u16 BPB_RsvdSecCnt;
u8 BPB_NumFATs;
u16 BPB_RootEntCnt;
u16 BPB_TotSec16;
u8 BPB_Media;
u16 BPB_FATSz16;
u16 BPB_SecPerTrk;
u16 BPB_NumHeads;
u32 BPB_HiddSec;
u32 BPB_TotSec32;
u8 BS_DrvNum;
u8 BS_Reservedl;
u8 BS_BootSig;
u32 BS_VolID;
u8 BS_VolLab[11];
u8 BS_FilSysType[8];
u8 ExecutableCode[448];
u8 ExecutableMarker[2];
}_BPB ;// 定义BPB

u8 BUFFER[512];
u16 BPB_BytesPerSec;
u8 BPB_SecPerClus;
u16 BPB_RsvdSecCnt;
u8 BPB_NumFATs;
u16 BPB_RootEntCnt;
u16 BPB_TotSec16;
u16 BPB_FATSz16;
u32 BPB_HiddSec;

u8 ReadBPB(void) //读BPB
{
u8 response;
_BPB *BPB=(_BPB*)BUFFER;

response=ReadFATSector(0);
if(response==1)
return 1;

BPB_BytesPerSec = BPB->BPB_BytesPerSec;
BPB_SecPerClus = BPB->BPB_SecPerClus;
BPB_RsvdSecCnt = BPB->BPB_RsvdSecCnt;
BPB_NumFATs = BPB->BPB_NumFATs;
BPB_RootEntCnt = BPB->BPB_RootEntCnt;
BPB_TotSec16 = BPB->BPB_TotSec16;
BPB_FATSz16 = BPB->BPB_FATSz16;
BPB_HiddSec = BPB->BPB_HiddSec;

return response;

}

但我执行我上面的程序后,我的BUFFER里面装的512个字节是对的,但是我一执行完这句:
_BPB *BPB=(_BPB*)BUFFER;

BPB里面装的值就不对了,BPB自动把BUFFER数组里面第四位BUFFER[3]给丢了而自动把后面的给填充上来了
具体的如下图
跪求高人指教

第1个回答  2010-06-01
可以用 union 试一下。

typedef union {
u8 BUFFER[512];
_BPB BPB;
} U8toBPB;

U8toBPB tmp;

利用union tmp,可以互相转换,位置一一对齐的。
相似回答