結構體對齊規則:
(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;
}