C语言 结构体字节对齐问题
方法一:
结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。
原则1 数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。
原则2 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)
原则3 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。
方法二:
struct的内存大小为每个数据内存的加和,首先按照最大的数据类型进行单个分配,如果前一个数据占用不了所有的内存,而剩下的内存可以放下下一个数据,则第二个数据不另外分配内存(但是地址必须是从这个数据类型大小的整数倍开始,看下面的struct C),否则重新分配一个最大类型的内存。
例题
链接:https://www.nowcoder.com/questionTerminal/8e8b73ee8f3a402ba47876f8e0b2b62d
来源:牛客网
在64位系统下,地址占64位
,即指针占64位,8个字节。
所以,*p所占的内存是这要的:
a【0-7】:本身占1个字节,因原则1,d起始位置需要是8的倍数,于是字节对齐占7个字节,共8个字节
d【8-15】:64位指针,占8字节
b【16-19】:占32位,4个字节
c:16 【20-23】:占16位,2个字节,因原则1,e起始位置需要是8的倍数,于是字节对齐占2个字节,共4个字节
e【24-32】:64位,8个字节
8 + 8 + 4 + 4 + 8 = 32