【发布时间】:2019-03-01 07:40:59
【问题描述】:
我已从https://www.geeksforgeeks.org/the-offsetof-macro/ 获取代码。
我在 gfg 本身提供的 ide 中运行代码。
我对代码进行了一些编辑,sizeof(int) 显示为 4,但显示通过偏移量在 struct 中占用 8 个字节
#include <stdio.h>
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))
typedef struct PodTag
{
int i;
double d;
char c;
} PodType;
int main()
{
printf("%ld", OFFSETOF(PodType, d) );
getchar();
return 0;
}
【问题讨论】:
-
你的操作系统/架构是什么?
-
它没有。问题是 double 成员,它需要对齐到 8。因此编译器需要使用 4 个字节的未使用空间(也称为填充)。填充也添加到结构的末尾,因此当在数组中使用结构时,双精度仍然与 8 对齐。谷歌“c 结构成员对齐”以了解更多信息。
-
什么是 OFFSETOF 宏?那不可能编译。您正在将 0 转换为 PodType 类型的结构的地址。
-
你不应该发明这样无用的宏。
offsetof是标准的一部分。您链接的教程网站声誉不佳,我不建议使用它。
标签: c++ c language-lawyer