2 piaoxue20161998 piaoxue20161998 于 2016.03.24 19:05 提问

C语言 数据结构内存布局问题

struct A
{
char e;
short f;
};

struct B
{
int a;
char b;
struct A c;
char d;

};

sizeof(struct B); 为什么是12?

struct A
{
char e;
int f;
};

struct B
{
int a;
char b;
struct A c;
char d;

};

sizeof(struct B);为什么是20?

求大牛解释解释 在线等。

6个回答

u011553604
u011553604   2016.03.24 19:15
piaoxue20161998
piaoxue20161998 看了,我就是不明白第一种为什么是 12,求大牛讲讲
一年多之前 回复
qq423399099
qq423399099   Ds   Rxr 2016.03.24 20:31

第一个是有点奇怪
struct B
{
int a;
char b;
struct A c;
char d;
};
1.什么都不去掉是12
2.只去掉char b;也是12
3.只去掉char d;也是12
4.去掉char b和char d,是8

ankangyanghushi
ankangyanghushi 因为struct A c被展开了
一年多之前 回复
qq_24262913
qq_24262913   2016.03.25 00:19

结构体里嵌套结构体,对齐的计算原则应该是将里面的结构体展开来计算

qq_24262913
qq_24262913 c语言里的自然对齐规则是位宽能够被所在地址整除,但还要考虑整个结构能够对齐,所以char也是占4个字节,计算结果是20
一年多之前 回复
piaoxue20161998
piaoxue20161998 那把第二个B展开和直接计算 占用空间大小不一样
一年多之前 回复
ankangyanghushi
ankangyanghushi   2016.03.27 17:55

内存结构分布是这样的(按VS/VC默认8字节对齐):
<-4字节宽度->
|a a a a|
|b e f f|
|d 0 0 0|

4字节宽度是根据sizeof(int)(所有属性中size最大)和8字节中取较小的,另外总的size必须是sizeof(int)的整数倍,不够填充0。
建议你可以找下相关知识充分理解一下。

ankangyanghushi
ankangyanghushi   2016.03.27 17:59

struct A
{
char e;
int f;
};
struct B
{
int a;
char b;
struct A c;
char d;
};
sizeof(struct B);为什么是20?

<-4字节宽度->
|a a a a|
|b e 0 0|
|c c c c|
|d 0 0 0|

ankangyanghushi
ankangyanghushi struct 的首地址要被结构内部的最大sizeof类型整除。
一年多之前 回复
ankangyanghushi
ankangyanghushi struct虽然是展开的,但是是另起一行,即e的地址要被4整除
一年多之前 回复
piaoxue20161998
piaoxue20161998 这样就是16啊 sizeof 测的20
一年多之前 回复
CSDNXIAOD
CSDNXIAOD   2016.03.30 11:22

c语言中内存布局问题
关于C语言中数据结构的内存对齐问题
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!