typedef struct _ITEM
{

BYTE m_bA;
char szName[14];        
WORD wD;
}ITEM, *PITEM; int abc = sizeof(ITEM);在调试器里看到 abc的值竟然等于 18

解决方案 »

  1.   

    更奇怪的是....................typedef struct _ITEM
    {

    // BYTE m_bA;
    char szName[14];        
    WORD wD;
    }ITEM, *PITEM;
    这样 得到值 是16 typedef struct _ITEM
    {

    BYTE m_bA;
    char szName[14];        
    // WORD wD;
    }ITEM, *PITEM;这样得到的值是15 
      

  2.   

    BYTE=1
    char[]=14
    WORD=2
    中间=16是对的
    上面=18,也许是编译器自动补齐
    下面的15就奇怪了,应该补齐到16阿
    如果补齐选项关了的话
    上面的应该是17阿
      

  3.   

    BYTE 到底是几呢?
    我觉的是几都矛盾啊 ... 无法解释 难道有的时候是1有的时候是2
      

  4.   

    肯定是1的啊
    编译器对齐可能有什么策略吧
    要不然char a[15]就应该分配16个字节了,但实际上不是(我没有试验过,不过引用a[15]好想会出错)
    #pragma pack(1)//好像是这个宏
    会指定对齐的字节
      

  5.   

    这是编译器对齐,在目前的win32系统中,有3钟基本数据类型:8-bits,16-bits,32-bits原则:对于任何基本数据类型地址存放起始必须为0x00000000+n*bits/8;n为自然数,bits对应于8,16,32,否则结果会不可预知(?)
    所以:
    1。typedef struct _ITEM
    {

    BYTE m_bA;
    char szName[14];        
    WORD wD;
    }ITEM, *PITEM; int abc = sizeof(ITEM);
    abc为18。
    假设m_bA在memory address:0x0012f6f4,
    那么szName[14]占用0x0012f6f5~0x0012f704,共14
    接下来要存放wD,但其地址0x0012f705,不符合原则,顾放到0x0012f706,
    所以size = 18
    2和3的的解释也是如此