1.概念
偏移量:结构体成员地址减去结构体首地址
2.规则:
1>第一个成员起始于0偏移处
2>.每个成员按其类型大小和指定对齐参数n较小的一个进行对齐
偏移地址和成员占用大小均需对齐
结构体成员的对齐参数Wie所有成员使用的对齐参数的最大值
3>.结构体总长度必须为所有对齐参数的整数倍
3.示例
1>
struct info
{
int num; //4
char c;
char ch[9]; //同类型在一起可以合起来:1+9+2=12
};
void main()
{
struct info info1 = { 10, 'a', "ddddd" };
printf("%d\n", sizeof(struct info)); //16
printf("%p\n", &info1); //0033FD54
printf("%p\n", &info1.num); //0033FD54
printf("%p\n", &info1.c); //0033FD58 //4
printf("%p\n", &info1.ch); //0033FD59 //同一类型char
system("pause");
}
2>
struct info
{
int num; //4
short c; //2
char ch[9]; // 9 + 1
};
void main()
{
struct info info1 = { 10, 5, "ddd" };
printf("%d\n", sizeof(struct info)); //16
printf("%p\n", &info1); //0014FCBC
printf("%p\n", &info1.num); //0014FCBC
printf("%p\n", &info1.c); //0014FCC0 //4
printf("%p\n", &info1.ch); //0014FCC2 //2
system("pause");
}
3>
struct info
{
short c; //2+2=4
int num; //4
char ch[9]; //9+3=12
};
void main()
{
struct info info1 = { 10, 5, "ddd" };
printf("%d\n", sizeof(struct info)); //20
printf("%p\n", &info1); //002AF888
printf("%p\n", &info1.c); //002AF888
printf("%p\n", &info1.num);//002AF88C //4
printf("%p\n", &info1.ch);//002AF890 //4
system("pause");
}