C 假定已启用填充,则结构的大小

C 假定已启用填充,则结构的大小,c,padding,C,Padding,假设我有一个定义如下的结构: typedef struct { char a; int b; char c; }abc_t; 现在根据填充规则,字符变量可以从任何地址开始,因为它只有一个字节,而intger变量应该从一个可以被4整除的地址开始,而短变量应该从任何偶数地址开始。 在这种情况下,如果我们假设字符变量从偏移量0开始 struct { char a; // OFFSET 0+3 bytes padding int b; // OFFSET 4

假设我有一个定义如下的结构:

 typedef struct
 {
   char a;
   int b;
   char c;
 }abc_t;
现在根据填充规则,字符变量可以从任何地址开始,因为它只有一个字节,而intger变量应该从一个可以被4整除的地址开始,而短变量应该从任何偶数地址开始。 在这种情况下,如果我们假设字符变量从偏移量0开始

struct
{
    char a; // OFFSET 0+3 bytes padding
    int b;  // OFFSET 4
    char c; //OFFSET 5+3 bytes padding
}abc_t;
在这里,结构的总尺寸将变为12

但我怀疑的是,如果结构的第一个元素‘char a’从偏移量1开始,那么根据填充规则,a后面只填充了2个字节,因此结构的大小将是8个字节

struct
{
    char a;//OFFSET 1+2 bytes
    int b;//OFFSET 4
    char c;//OFFSET 8
}abc_t;
任何以短变量开头的结构变量的情况也是如此。 你能告诉我我对这一点的理解是否正确,或者我们能安全地假设任何结构的第一个成员总是从一个可以被4整除的地址开始吗


提前非常感谢。

这里有几个问题:

1) int的大小不是必需的4字节,它的sizeof(int)由编译器定义。可以是4字节、8字节甚至2字节,具体取决于字长。看

2) 结构中的字段对齐由编译器决定。您放置字段的顺序并不保证打包更紧密。但是,字段的顺序是保留的。看

3) 将较短的结构放在一起通常会导致更紧密的包装

4) 结构从单词边界开始。在第一个字段之前从来没有任何填充。是的,地址应该在一个词的开头


希望这有帮助。

在合理的常见限制/假设下,所示结构将以4字节的倍数开始。结构中不能有前导填充。其他结构可能或多或少需要严格对齐。例如,
struct ver1{char a;short b;char c;}
很可能大小为6,并在任何偶数边界上对齐,而
struct ver2{char a;double d;char e;}
很可能大小为24,并在8字节的任意倍数上对齐。我非常确定有一条规则,即结构的第一个成员的地址在数字上始终等于结构的地址,即在第一个成员之前不存在任何填充,也就是说,第一个成员的偏移量始终为0。@SteveSummit:肯定:§6.7.2.1结构和联合说明符¨15…结构对象中可能有未命名的填充,但不在其开头…17在结构或联合体的末端可能有未命名的填充物。