1. struct STUDENT
    2. {
    3. char a;
    4. int b;
    5. }data;

    如上结构体变量data占用了多少字节?char占用1字节,int占用4字节,所以总共占用5个字节,我们写程序来验证一下:

    1. # include <stdio.h>
    2. struct STUDENT
    3. {
    4. char a;
    5. int b;
    6. }data;
    7. int main(void)
    8. {
    9. printf("%p, %p\n", &data.a, &data.b); //%p是取地址输出控制符
    10. printf("%d\n", sizeof(data));
    11. return 0;
    12. }
    13. // 输出结果是
    14. // 00427E68, 00427E6C
    15. // 8

    我们看到data不是占用5字节,而是占用8个字节。变量a的地址是从00427E68到00427E6B,占4字节。变量b的地址是从00427E6C到00427E6F,也是占4字节。b占4字节我们可以理解,但是a是char型号,为什么不是1个字节呢?我们这里就需要说一说字节对称的概念了。

    上面代码中的内存模型如下图所示:
    image.png
    我们说,所有的成员在分配内存时候都需要与所有成员中所占内存最多的数据类型所占内存空间的字节数对齐,假设这个字节数是N, 那么对齐的原则为:

    1. 理论上所有成员在分配内存时都是紧接在前一个变量后面依次填充的
    2. 但是如果是“以N对齐”的原则,如果一行中剩下的空间不足以填充某成员变量,即剩下的空间小于某成员变量的数据类型所占的字节数,则该成员变量在分配内存时另起一行分配

    再举个例子:

    1. struct STUDENT
    2. {
    3. char a;
    4. char b;
    5. char c;
    6. char d;
    7. char e;
    8. int f;
    9. }data;

    内存分配如下:

    1. ![image.png](https://cdn.nlark.com/yuque/0/2021/png/2332713/1622992295949-cb7833c3-8699-4f1f-bbff-ba9581394527.png#clientId=u6b0f7ea1-27dd-4&from=paste&height=254&id=u199bebc6&margin=%5Bobject%20Object%5D&name=image.png&originHeight=254&originWidth=258&originalType=binary&ratio=2&size=6180&status=done&style=none&taskId=ue7c589cb-9a79-4301-8aa9-4ada5266c51&width=258)