结构体的长度并不是简单地将结构体地所有成员相加
它中间会出现偏移量,我们以下为例
现有如下结构体:
struct good
{
char c;
int id;
char g;
int shop;
double price;
int num;
char rec[50];
}
我们假设初始地址开始为0
c的长度为1,0可以整除1,当c填充到内存后地址加1,即此时到了地址为1的位置
id的长度为4,地址位置1不可以整除4,所以在c填充到内存时需要加3,我们可以理解为c后面有3个空位,当id填充到内存后地址位置为8
g的长度为1,地址位置8可以整除1,当g填充到内存后地址加1,即地址位置为9
shop的长度为4,9不可以整除4,所以g的后面需要有3个空位,当shop填充到内存后地址为16
price的长度为8,16可以整除8,直接将其添加到内存中,此时地址为24
num的长度为4,24可以整除4,直接将其添加到内存中,此时地址为28
rec字符串我们可以理解为50个char的字符,因为char字符的长度为1,能被任何数整除,所以直接将其添加到内存中,此时地址为78
最后我们需要加上一个值,使最终这个结果能整除结构体最长成员的长度,在此结构体中最长成员的长度为8,即double类型(不是char rec[50],因为数组是由多个相同类型组成的),所以最终的结果为80
好像也有说最终结果必须是所有成员的公倍数,不过C语言中所有类型满足倍数关系,64位系统中如char(1),short(2),int(4),long long(8),float(4),double(8)。所以我们直接找长度最大的就可以了
这只是一个求结构体长度的方式,仅供参考!