A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 秋天De神话 中级黑马   /  2014-3-27 21:33  /  1178 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

结构体中包含char,int,等类型,老师说算结构体内存储字节数的时候会补成最大类型的整数倍,具体怎么补没说,谁知道里面具体怎么补得,比如里面的char的存储地址发生变化没?

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

4 个回复

倒序浏览
地址是不会变的,因为在分配存储空间时已经分配好了地址。而扩充内存字节数,是将int4字节提升到char8字节,而结构体有int和char两个成员,就变成了2*8字节的存储空间,而int和char分别占据了8个字节的内存,地址就已经分配好了。

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
FlyTrem 发表于 2014-3-27 21:56
地址是不会变的,因为在分配存储空间时已经分配好了地址。而扩充内存字节数,是将int4字节提升到char8字节 ...

那么int的地址呢,扩充了,也没有发生变化吗,   
回复 使用道具 举报
struct C
{
    char b;
    int a;
    short c;
};

#pragma pack ()

第一个变量b的自身对齐值为1,指定对齐值为2,所以,其有效对齐值为1,假设C从0x0000开始,那么b存放在0x0000,符合 0x0000%1= 0;第二个变量,自身对齐值为4,指定对齐值为2,所以有效对齐值为2,所以顺序存放在0x0002、0x0003、0x0004、0x0005四个连续字节中,符合0x0002%2=0。第三个变量c的自身对齐值为2,所以有效对齐值为2,顺序存放在0x0006、0x0007中,符合 0x0006%2=0。所以从0x0000到0x00007共八字节存放的是C的变量。又C的自身对齐值为4,所以C的有效对齐值为2。又8%2=0,C 只占用0x0000到0x0007的八个字节。所以sizeof(struct C)=8。
这个例子已经很详细了,结构体中的变量在选择内存地址时必须选择是它本身长度倍数的地址才行,等都选好了 ,然后再对齐,而且你可以多举几个例子,多弄几个成员试试

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
秋天De神话 发表于 2014-4-2 20:35
那么int的地址呢,扩充了,也没有发生变化吗,

当然,我想你是认为对int已经分配好空间,然后进行扩充是吗?其实不是这样的,系统在执行到此段代码时,会分配空间,对较小的类型进行提升后分配内存空间,所以int的地址是固定的了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马