黑马程序员技术交流社区

标题: 结构体内存存储细节疑问 [打印本页]

作者: 秋天De神话    时间: 2014-3-27 21:33
标题: 结构体内存存储细节疑问
结构体中包含char,int,等类型,老师说算结构体内存储字节数的时候会补成最大类型的整数倍,具体怎么补没说,谁知道里面具体怎么补得,比如里面的char的存储地址发生变化没?
作者: FlyTrem    时间: 2014-3-27 21:56
地址是不会变的,因为在分配存储空间时已经分配好了地址。而扩充内存字节数,是将int4字节提升到char8字节,而结构体有int和char两个成员,就变成了2*8字节的存储空间,而int和char分别占据了8个字节的内存,地址就已经分配好了。
作者: 秋天De神话    时间: 2014-4-2 20:35
FlyTrem 发表于 2014-3-27 21:56
地址是不会变的,因为在分配存储空间时已经分配好了地址。而扩充内存字节数,是将int4字节提升到char8字节 ...

那么int的地址呢,扩充了,也没有发生变化吗,   
作者: agelessman    时间: 2014-4-2 21:04
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。
这个例子已经很详细了,结构体中的变量在选择内存地址时必须选择是它本身长度倍数的地址才行,等都选好了 ,然后再对齐,而且你可以多举几个例子,多弄几个成员试试

作者: FlyTrem    时间: 2014-4-3 09:27
秋天De神话 发表于 2014-4-2 20:35
那么int的地址呢,扩充了,也没有发生变化吗,

当然,我想你是认为对int已经分配好空间,然后进行扩充是吗?其实不是这样的,系统在执行到此段代码时,会分配空间,对较小的类型进行提升后分配内存空间,所以int的地址是固定的了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2