虽然编程时出现什么怪问题都不奇怪 但这个问题让我见鬼了 请看!!!!!!!!

realmiss 2004-01-05 07:04:06
typedef struct _ITEM
{

BYTE m_bA;
char szName[14];
WORD wD;
}ITEM, *PITEM;

int abc = sizeof(ITEM);

在调试器里看到 abc的值竟然等于 18
...全文
77 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
talcon_hu 2004-01-05
  • 打赏
  • 举报
回复
这是编译器对齐,在目前的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的的解释也是如此
realmiss 2004-01-05
  • 打赏
  • 举报
回复
看来我知道的太少了
luoshayu 2004-01-05
  • 打赏
  • 举报
回复
肯定是1的啊
编译器对齐可能有什么策略吧
要不然char a[15]就应该分配16个字节了,但实际上不是(我没有试验过,不过引用a[15]好想会出错)
#pragma pack(1)//好像是这个宏
会指定对齐的字节
realmiss 2004-01-05
  • 打赏
  • 举报
回复
BYTE 到底是几呢?
我觉的是几都矛盾啊 ... 无法解释 难道有的时候是1有的时候是2
foxmail 2004-01-05
  • 打赏
  • 举报
回复
BYTE=1
char[]=14
WORD=2
中间=16是对的
上面=18,也许是编译器自动补齐
下面的15就奇怪了,应该补齐到16阿
如果补齐选项关了的话
上面的应该是17阿
luoshayu 2004-01-05
  • 打赏
  • 举报
回复
你把编译器默认的对正字节设为1
就不会出现这样的问题了
但是程序的效率可能会降低
realmiss 2004-01-05
  • 打赏
  • 举报
回复
更奇怪的是....................

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

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧