结构体P1内存大小、P5成员t偏移量计算疑问咨询
结构体内存布局与对齐问题解答
咱们先把核心逻辑说透:结构体的内存大小和成员偏移量,完全取决于目标平台(32位/64位)和编译器默认的对齐规则,这就是你和参考答案产生差异的根本原因。
一、为什么struct P1的大小会有16和24两种结果?
先明确两个几乎所有编译器都遵循的对齐规则:
- 结构体里每个成员的起始位置,必须是该成员自身大小的整数倍;
- 结构体的总大小,必须是所有成员里「最大对齐单位」的整数倍(通常最大对齐单位等于最大成员的大小)。
场景1:32位平台(指针占4字节)
这就是参考答案的计算逻辑:struct P1 {short i; int c; int *j; short *d;};
short i:占2字节,从偏移0到1;- 因为
int c需要4字节对齐(起始偏移得是4的倍数),所以在i后面补2字节填充(偏移2到3); int c:占4字节,从偏移4到7;int* j:32位下指针是4字节,刚好从偏移8开始(8是4的倍数,不用补填充),占8到11;short* d:同样是4字节指针,从偏移12到15;- 总大小刚好16字节,是最大对齐单位(4字节)的整数倍,符合规则。
场景2:64位平台(指针占8字节)
你的计算完全正确:
short i:占2字节,偏移0到1;- 补2字节填充,让
int c从偏移4开始(满足4字节对齐),占4到7; int* j是8字节指针,需要8字节对齐,刚好从偏移8开始,占8到15;short* d也是8字节指针,从偏移16到23;- 总大小24字节,是最大对齐单位(8字节)的整数倍,完全符合64位平台的对齐规则。
说白了:你和参考答案的差异,只是一个按64位平台计算,一个按32位平台计算,两边都没错。
二、关于struct P5中t的偏移量疑问
先看struct P4的定义:struct P4 {char w[16]; int *c[2]};
按参考答案对应的32位平台计算:
char w[16]:占16字节,从偏移0到15(16是4的倍数,不用补填充);int* c[2]:两个32位指针,每个4字节,共8字节,从偏移16到23;struct P4的总大小是16+8=24字节;a[2]是两个P4实例,总大小就是2*24=48字节,所以t的起始偏移应该是48字节,而不是你说的24字节。
这里大概率是你看错了参考答案,或者参考答案存在笔误——如果偏移量确实是24,那只可能是a[1](单个P4实例),或者P4里的w长度被写错了(比如是6字节而不是16字节)。
内容的提问来源于stack exchange,提问作者Vita Z
相关产品推荐
相关产品推荐

