注意:
出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则:
(1)结构体变量的大小能够被其最宽基本类型成员的大小所整除;
(2)结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
字节对齐第3条准则提及最宽基本类型的概念,所谓基本类型是指像char、short、int、float、double这样的内置数据类型。“数据宽度”就是指其sizeof的大小。诸如结构体、共用体和数组等都不是基本数据类型
最宽基本成员 double int char 结构体数组等都不是最宽基本成元 //结构体大小必须可以整除最宽基本成员 是最宽基本成员的整数倍
结构体成员地址-结构体首地址就是偏移量 必须可以整除成员变量
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 //最宽基本成员 double int char 结构体数组等都不是最宽基本成员 5 //结构体大小必须可以整除最宽基本成员 是最宽基本成员的整数倍 6 7 //结构体成员地址-结构体首地址就是偏移量 必须可以整除成员变量 8 struct info 9 { 10 //规则1结构体变量的大小能够被其最宽基本类型 11 //成员的大小所整除; 12 //char c; 13 //char sh; 14 //char ch[9];//11 15 16 //最宽的int 4 17 //char c;//4 18 //int sh;//4 19 //char ch[7];//8 //16 20 21 int num;//4 22 int num2;//4 23 char c[19];//20 24 }; 25 void main1() 26 { 27 printf("%d",sizeof(struct info)); 28 29 getchar(); 30 } 31 32 void main() 33 { 34 struct info info11 = {10,200,"1564"}; 35 printf(" %p",&info11);//0032fc14 36 printf(" %p",&info11.num);//0032fc14 37 printf(" %p",&info11.num2);//0032fc18 38 printf(" %p",&info11.c);//0032fc1c 39 40 getchar(); 41 }