结构体的大小不一定是所有成员大小之和

         今天在申请内存空间的时候发现结构体的大小并不是结构体内成员大小的相加,我觉得很奇怪,就在搜了一下资料,发现原来如此:        

         结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间,需要注意的是结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。

         这就涉及到一个定义:偏移量,偏移量指的是结构体变量中成员的地址和结构体变量地址的差。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。举个例子:

typedef struct{
    int count;
    int  num;   
    char s; 
}INFO;

  第一个成员的偏移量是0,第二个成员的偏移量是4,第三个成员的偏移量是8,那么结构体的大小是不是就是8+1呢,答案NO。

因为,由于存储变量时地址对齐的要求,编译器在编译程序时会遵循两条原则:

一、成员的偏移量必须是成员大小的整数倍(0被认为是任何数的整数倍);

二、结构体大小必须是所有成员大小的整数倍。

所以这个结构体的大小应给为12
你可以在程序中用sizeof(类型)尝试看看!

原文地址:https://www.cnblogs.com/candycaicai/p/1877766.html