结构体对齐规则:
(1)第一个成员在与结构体变量偏移量为0处
(2)其他成员变量需要对齐到某个数字(对齐数)的整数倍的地址处
对齐数=编译器默认的一个对齐数与该成员大小的较小值
VS中默认为8
(3)结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍
(4)如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
#include <stdio.h>
#include <stddef.h>
struct A
{
double a;
char c;
char d;
};
struct B
{
char c;
int a;
char d;
};
//在D中声明一个A的成员
struct D
{
int i;
double d;
char c;
struct A a;
};
//在AA中嵌套一个BB
struct AA
{
int a;
double d;
struct BB
{
int bb;
double dd;
};
char c;
};
struct DD
{
int a;
double d;
int bb;
double dd;
char c;
};
int main()
{
struct A sa;
printf("%p\n", &(sa.a));
printf("%p\n", &sa);
printf("sizeof(A) = %d\n", sizeof(struct A));
printf("sizeof(B) = %d\n", sizeof(struct B));
printf("sizeof(D) = %d\n", sizeof(struct D));
printf("sizeof(AA) = %d\n", sizeof(struct AA));
printf("sizeof(DD) = %d\n", sizeof(struct DD));
printf("i:%d\n", offsetof(struct D, i));
printf("d:%d\n", offsetof(struct D, d));
printf("c:%d\n", offsetof(struct D, c));
printf("a:%d\n", offsetof(struct D, a));
return 0;
}