Linux 结构的大小与结构最后一个元素的偏移量

Linux 结构的大小与结构最后一个元素的偏移量,linux,gcc,sizeof,offsetof,Linux,Gcc,Sizeof,Offsetof,我有一个由几个元素组成的C结构。当我在结构的最后一个元素上键入offsetof()时,它显示144,而sizeof()最后一个元素是4。所以,我假设结构的大小是148。但是,在结构本身上运行sizeof()会返回值152。关于偏移量有什么我误解的吗?这座建筑的尺寸不应该是148而不是152吗?是否应用了某种填充来匹配字节?我在Ubuntu 14的64位平台上运行 Struct A{ // few elements }; Struct B{ Struct A; <type> C

我有一个由几个元素组成的C结构。当我在结构的最后一个元素上键入offsetof()时,它显示144,而sizeof()最后一个元素是4。所以,我假设结构的大小是148。但是,在结构本身上运行sizeof()会返回值152。关于偏移量有什么我误解的吗?这座建筑的尺寸不应该是148而不是152吗?是否应用了某种填充来匹配字节?我在Ubuntu 14的64位平台上运行

Struct A{
// few elements 
};

Struct B{
 Struct A;
 <type> C;
 <type> D;
 // few more elements
};
结构A{ //少元素 }; 结构B{ 结构A; C D //没有更多的元素 }; 元素C的偏移量为148(可能是因为未应用填充),但结构a的大小为152(很可能是由于填充),因此,当执行memcpy时,分配给元素C的值将被调零


更新:刚刚验证的sizeof()元素C是4个字节,因此,在第148个偏移量之后立即包含它是有意义的。

没有填充,至少在结构之前或之后没有填充。但是,如果在同一个结构中使用不同的数据类型,有时会添加一个以提高性能。这是一个编译器设置,如果您需要,可以禁用它。

的可能重复项似乎与我可能看到的非常接近,我的32位exe似乎不会导致任何问题。但是,64位是这样的。将更仔细地查看#pragma设置。最后一个成员后面的填充是如何造成问题的?它的存在是有原因的。实际上,这个相同的结构包含在另一个结构中,它后面的成员很少。紧跟在第一个结构之后的成员的偏移量为148,但由于我们从填充结构执行memcpy,导致大小为152,第二个结构中的成员内容被零覆盖,因此,值重置为零…如果实际问题是某个成员被错误覆盖,你可能应该发布一个新的问题,用一个自足的程序来说明实际的行为。