结构体中的成员并不是紧挨着分布的,内存分布遵循字节对齐的原则。
按照成员定义的顺序,遵循字节对齐的原则存储。
字节对齐的原则:
找成员中占据字节数最大的成员,以它为单位进行空间空配 --- 遇到数组看元素的类型
每一个成员距离它所在结构体空间的首地址 必须是 它所占字节数的整数倍。
结构体空间必须是 所占 字节数最大成员的整数倍。
例1:
struct test1
{char a;short b;int c;double d;
};// 看这个结构体在内存中的成员分布情况,怎么看?
struct test1 t1;
printf("%d\n",sizeof(t1)); // 16
printf("%p %p %p %p",&t1.a,&t1.b,&t1.c,&t1.d); // 90 92 94 98
例2:
struct test2
{char a;int c;short b;char d;double f;char c2;
};struct test2 b;
printf("%d\n",sizeof(b)); // 32
例3:
struct test1
{char a1;double c;char a2;
};struct test2
{char a;short b;struct test1 t1; // char t1.a1;// double t1.c;// char t1.a2;short d;
};struct test2 v;// 找最大成员如果里面有结构体 打散看 --- 分配单位是 8个字节
printf("%d\n",sizeof(v)); // 40printf("%p %p %p %p %p %p",&v.a,&v.b,&v.t1.a1,&v.t1.c,&v.t1.a2,&v.d); // 78 7A 80 88 90 98