如何在C结构中计算填充

如何在C结构中计算填充,c,struct,C,Struct,虽然我了解填充通常如何在C结构中工作,但我很难理解内部结构是如何填充的。例如: struct inner { int a; } struct outer { char a; struct inner b; } 如何计算成员outer.a和成员outer.b之间的填充 当成员inner.a的数据类型从int更改为short或double时,如何计算结构outer结尾的填充 与64位体系结构相比,在32位体系结构中计算这些填充的含义是什么?我总是发现最好是将这些内容转储并进行

虽然我了解填充通常如何在C结构中工作,但我很难理解内部结构是如何填充的。例如:

struct inner
{
    int a;
}

struct outer
{
   char a;
   struct inner b;
}
如何计算成员
outer.a
和成员
outer.b
之间的填充

当成员
inner.a
的数据类型从
int
更改为
short
double
时,如何计算结构
outer
结尾的填充


与64位体系结构相比,在32位体系结构中计算这些填充的含义是什么?

我总是发现最好是将这些内容转储并进行处理,以便更好地理解。以下是您案例的一个示例:


请参阅,这是否回答了您的问题?除了极少数非常特殊的情况(例如,当您需要使用assembler访问这些结构成员时),您应该避免任何需要特定知识的构造。即使您需要,也应该让编译器执行所需的决定(使用
offsetof()
宏),而不是自己尝试执行。@truthseek似乎
struct outer
的成员在您的代码段中(错误地)颠倒了。另外,如果struct
internal
的成员
a
int
更改为
short
double
,会发生什么情况。那么填充数字是什么呢?填充是特定于实现的,这意味着每个实现可能有不同的填充,这意味着它取决于编译器。每个编译器可以插入不同(或相同)的填充,并且可以以不同的方式计算填充。C标准没有指定如何计算填充,只是说它是实现定义的。实现定义了如何计算填充。因此,您必须指定您心目中的编译器,然后有人可以找到该编译器计算填充的源代码。