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

注意:

出于效率的考虑,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 }
原文地址:https://www.cnblogs.com/lanjianhappy/p/6013898.html