【发布时间】:2014-11-03 05:46:57
【问题描述】:
我有一个由几个元素组成的 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
};
元素 C 的偏移量为 148(可能是因为未应用填充),但结构 A 的大小为 152(很可能是由于填充),因此,当执行 memcpy 时,分配给元素 C 的值得到归零。
更新:刚刚验证 sizeof() 元素 C 是 4 个字节,因此,它在第 148 个偏移量之后立即包含在内是有意义的。
【问题讨论】:
-
似乎与我正在寻找的非常接近,我的 32 位 exe 似乎没有造成任何问题。但是,64 位可以。将更仔细地查看#pragma 设置。
-
最后一个成员之后的填充是怎么回事?它的存在是有原因的。
-
实际上,这个相同的结构包含在另一个结构中,它后面的成员很少。第一个结构之后的成员的偏移量为 148,但由于我们从填充结构执行 memcpy,导致大小为 152,第二个结构中成员的内容被零覆盖,因此,值重置为零...
-
如果实际问题是成员被错误地覆盖,您可能应该发布一个新问题来询问该问题,并使用说明实际行为的独立程序。