虽然编程时出现什么怪问题都不奇怪 但这个问题让我见鬼了 请看!!!!!!!! typedef struct _ITEM{ BYTE m_bA; char szName[14]; WORD wD;}ITEM, *PITEM; int abc = sizeof(ITEM);在调试器里看到 abc的值竟然等于 18 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 更奇怪的是....................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 BYTE=1char[]=14WORD=2中间=16是对的上面=18,也许是编译器自动补齐下面的15就奇怪了,应该补齐到16阿如果补齐选项关了的话上面的应该是17阿 BYTE 到底是几呢?我觉的是几都矛盾啊 ... 无法解释 难道有的时候是1有的时候是2 肯定是1的啊编译器对齐可能有什么策略吧要不然char a[15]就应该分配16个字节了,但实际上不是(我没有试验过,不过引用a[15]好想会出错)#pragma pack(1)//好像是这个宏会指定对齐的字节 这是编译器对齐,在目前的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 = 182和3的的解释也是如此 我从网上看到的代码,我修改成了精简版!可是有一个错误解决不了! 如何重用对话框类 如何确定工具栏上文字和图片的位置? 100分请教msflexGrid的数据绑定问题 制作浏览器时,对于无法查看的网页,在那个函数中调用链接库资源,提示无法连接。 FTP的LIST命令 openGL中用gluUnProject获得深度坐标的问题 模拟UNIX 文件系统的设计及实现 如何用_RecordsetPtr直接更新记录? 如何在NT下实现端口I/O的读写操作例如对0x3DA端口进行读取 请教:CPU主频与指令执行时间之间的确切关系 调试状态的时候怎么样看到变量的值?
{
// 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
char[]=14
WORD=2
中间=16是对的
上面=18,也许是编译器自动补齐
下面的15就奇怪了,应该补齐到16阿
如果补齐选项关了的话
上面的应该是17阿
我觉的是几都矛盾啊 ... 无法解释 难道有的时候是1有的时候是2
编译器对齐可能有什么策略吧
要不然char a[15]就应该分配16个字节了,但实际上不是(我没有试验过,不过引用a[15]好想会出错)
#pragma pack(1)//好像是这个宏
会指定对齐的字节
所以:
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的的解释也是如此