当我们写代码的时候,会用到很多变量,如果随意的定义变量,比如写了 N 多个“unsigned char/int X;”那么代码可能会显的很乱,自己拐回头看的时候都晕掉了,这个时候我们可以构造一个复杂的数据类型-结构体类型,对代码中出现的变量进行类别的划分,用构造的结构体类型定义结构体变量,在写 or 看代码的时候,只要看到这个结构体 就能大致的知道其实现功能,这样看起来就神清气爽了,可读性大大提高我们定义的结构体变量,如果没有特殊规定的话是存储在 RAM 中的,单片机的 RAM 资源是有限的,那这个结构体变量在 RAM 中占的空间大小就是我们需要关注一个问题了,它真的像你想的那么“单纯”吗?接下来我们一起来看看吧! 在看下面的图之前,我们说一个前提,在STM32单片机这个32位系统中,signed/unsigned int 占 4 个字节,signed/unsigned short int 占 2 个字节 signed/unsigned char 占 1 个字节,我们称这些为基本数据类型。Size = Sizeof(Test);这个函数是求取这个结构体变量 Test 所占内存的大小,并返回给 Size。 ![]() 请看上图,我们使用基本数据类型构造了 3 个复杂的结构体数据类型,仔细看会发现这 3 个数据类型的成员可是不大一样的,我们来看第一个 Test,这个数据类型总共占 4+4=8 个字节 这个很好理解,那第二个 Test1,占空间大小按道理来说应该是 1+4 = 5 个字节 但 是为什么还是 8 呢,第三个 Test2,占空间大小应该是 1+1+4=8,为什么还是 8 呢? 这个里面就涉及到了结构体对齐,所有的成员在分配内存时都要与所有成员中占内存最 多的基本数据类型所占内存空间的字节数对齐。假如这个字节数为 N,那么对齐的原则是: 理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的,但是如果是“以 N 对齐”为原则 如果一行中剩下的空间不足以填充某成员变量时,即剩下的空间小于 某成员变量的 数据类型所占的字节数,该成员变量在分配内存时另起一行分配。如图 3,4: ![]() |