// 自定义的数据结构
typedef struct tagHostOUTSend
{
BYTE bHead;
BYTE bFlag;
DWORD dwTag;
WORD wTotalPack;
WORD wCurrentPack;
WORD wLength;
BYTE Data[48];
}HOSTOUTSEND, *PHOSTOUTSEND;// 定义
PHOSTOUTSEND pSendPack = new HOSTOUTSEND;
BYTE SendBuffer[USBPack];// 这里有问题
ZeroMemory(SendBuffer, USBPack);
memcpy(SendBuffer, pSendPack, USBPack);我调试运行的时候,看到bHead和bFlag在SendBuffer中占了4个字节(各占2个),dwTag从第5个字节开始.我程序通过USB发送数据包,用Bus Hound看到的结果也是如此.这是为什么?BYTE不是unsigned char吗?而且用sizeof(HOSTOUTSEND) = 64,这是又是为什么?数据结构数据sizeof

解决方案 »

  1.   

    而且用sizeof(HOSTOUTSEND) = 64,这是又是为什么?
    四字节对齐吧。
    前两个BYTE放在一个DWORD里,然后是一个单独的DWORD,接着两个WORD组成一个DWORD,然后一个单独的WORD占据一个DWORD,最后是48个BYTE,总共是48+4*4 = 64
      

  2.   

    LS两位说的对,编译器的字节对齐,若不想,可pragma pack自己去对其
      

  3.   


    那这会对我的发送有影响吗?
    我通过USB发送后,接收方可以直接用我的数据结构吗?
    Recv(RecvBuffer, USBPack);
    memcpy(pSendPack, RecvBuffer, USBPack);
    这样可以吗?
      

  4.   


    那这会对我的发送有影响吗?
    我通过USB发送后,接收方可以直接用我的数据结构吗?
    Recv(RecvBuffer, USBPack);
    memcpy(pSendPack, RecvBuffer, USBPack);
    这样可以吗?
    统一编译器下,两边都是你写就不会有问题,不然就照我说的字节对齐
      

  5.   


    typedef struct tagHostOUTSend
    {
        BYTE    bHead;
        BYTE    bFlag;
        WORD    wLength;
        DWORD   dwTag;
        WORD    wTotalPack;
        WORD    wCurrentPack;
        BYTE    Data[48];
    }HOSTOUTSEND, *PHOSTOUTSEND;
    那这样是不是避免这个?