嵌入式学习笔记 - 关于结构体成员地址对齐问题
一 在没有#pragma pack()这个宏声明的情况下
C语言中结构体成员分配内存大小时需要满足2个条件,这也是内存对齐的原则:
①每个成员变量的起始地址必须为其数据类型所占空间大小的整数倍
②结构体所占空间总大小为其最大数据类型成员变量大小的整数倍
例如:
其地址分配如下图,因为b的大小位4字节,所以起始地址必须另起一行,放在起始为0,4,8,C起始地址的内存地址,又因为结构体总大小为最大成员变量的整数倍,所以此结构体大小为4*3=12byte。
再例如:
其地址分配如下图,因为c的大小位2字节,所以起始地址可以放在起始为0,2,4,8起始地址的内存地址,又因为结构体总大小为最大成员变量的整数倍,所以此结构体大小为4*2=8byte。
二 在有#pragma pack()这个宏声明的情况下,规则要改一下:
是按照这个宏声明的和实际数据类型中最大值较小的那个来决定
例如:当宏声明比实际数据类型中最大值小时:
因为加了#pragma pack(1),按照如下图分配地址,结果为5
当宏声明#pragma pack(8)比实际数据类型中最大值(这里为4)大时,还是按照实际数据类型进行分配地址:
如下图,结果为12