前言
在做题时遇见求结构体大小, 看源码
struct book
{
char name;
int id;
double price;
};
int main()
{
printf("%d", sizeof(struct book));
return 0;
}
当时简单的认为输出结果为 1+4+8=13; 结果答案是16, 怎么会这样呢?
计算方法
-
首先要了解什么是偏移量
偏移量指的是结构体变量中成员的地址和结构体变量地址的差。
-
结构体大小
结构体大小等于最后一个成员的偏移量加上最后一个成员的大小注意事项:
c. 结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数
a. 存储变量时地址要求对齐
b. 结构体变量中成员的偏移量必须是成员大小的整数倍
例如:
char 偏移量必须为sizeof(char)即1的倍数
short 偏移量必须为sizeof(short)即2的倍数
int 偏移量必须为sizeof(int)即4的倍数
float 偏移量必须为sizeof(float)即4的倍数
double 偏移量必须为sizeof(double)即8的倍数
实例1
struct book
{
char name; // 第一个成员name的偏移量为0
int id; // 第二个成员id的偏移量是上一个成员的偏移量加上上一个成员的大小:0+1=1,但必须是第二个变量类型长度4的倍数,即1+3=4
double price; // 第三个成员price的偏移量是上一个成员的偏移量加上上一个成员的大小: 4+4=8, 这里刚好就是double长度8的倍数(1倍), 即8
// 最后结构体大小等于最后一个成员的偏移量加上最后一个成员的大小: 8+8=16
// 另外结构体大小必须是所有成员大小的整数倍,就是所有成员大小的公倍数。
// 大于等于16, 还要是1,4,8的公倍数
};
struct book2{
char name; //第一个成员name的偏移量为0
int id; //第二个成员id的偏移量是上一个成员的偏移量加上上一个成员的大小: 0+1=1,但必须是第二个变量类型长度4的倍数,即为1+3=4
float price; //第三个成员price的偏移量是上一个成员的偏移量加上上一个成员的大小: 4+4=8,但必须是第三个变量类型长度4的倍数,即为8
char date; //第四个成员date的偏移量是上一个成员的偏移量加上上一个成员的大小: 8+4=12,但必须是第四个变量类型长度1的倍数,即为12
// 最后结构体大小等于最后一个成员的偏移量加上最后一个成员的大小: 12+1=13
//另外结构体大小必须是所有成员大小的整数倍,也即所有成员大小的公倍数。
//大于等于13,还要是1,4,4,1的公倍数 =====> 13+3=16
};