c语言结构体在内存中存储,字节对齐

时间:2021-09-05 10:35:06

注意:

出于效率的考虑,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("\n%p",&info11);//0032fc14
36 printf("\n%p",&info11.num);//0032fc14
37 printf("\n%p",&info11.num2);//0032fc18
38 printf("\n%p",&info11.c);//0032fc1c
39
40 getchar();
41 }