了解C语言中的结构填充

时间:2018-07-11 15:35:29

标签: c structure padding

通过数据对齐概念,我了解到int和floats应该存储在可被4整除的地址(起始字节地址)中。据此,以下结构的大小为12

 typedef struct{
    char A;
    int B;
    float C;
}y;

我毫无疑问地了解上述结构的大小 现在我对下面结构的大小感到怀疑

typedef struct {
    double A;
    char B;
    char C;
}x;

x的大小为16。我的疑问是,可以将所使用的两个字符分配为2个字节,以便整个结构使用10个字节的数据 剩下的2个字节在声明正确时可以用于分配给另一个short int?

但是编译器使用16字节的数据并填充其他6个单元。我不明白为什么如果在声明它们时可以将它们用于其他变量,又浪费了另外6个单元格呢?有人可以帮我理解上面的概念吗?(我假设int,float和double的大小分别为4,4,8字节。)

1 个答案:

答案 0 :(得分:3)

对于x,它包含一个double,该x(以您的情况为例)的大小为8。这意味着,整个结构需要为该大小的倍数,以便x的数组以正确对齐。

由于数组是连续分配的,因此数组中的每个成员紧随内存中的前一个之后。如果A的大小为10,则对于一个数组,第二个元素的Session成员的偏移量为10。为了正确对齐,每个数组成员都必须以最大元素的大小的倍数开始。因此,结构的末尾包含填充以完成此操作。