【问题标题】:How to compute offset between two different struct members in C?如何计算C中两个不同结构成员之间的偏移量?
【发布时间】:2012-07-23 02:54:05
【问题描述】:

考虑以下 C 代码:

struct Foo
{
  short a;
  long b;
  char c;
  void* d;
};

我知道使用 sizeof 可以知道整个结构的大小。是否有可能知道这个结构的一个子集的大小,或者(换句话说)知道两个成员之间的距离?我意识到可以根据我想要的偏移量嵌套结构(然后可以使用 sizeof),但是说我想知道 a 和 d 之间的字节数?另外,我想在不实例化对象的情况下执行此操作(类似于 sizeof)。 (我意识到如果我有一个对象,那么我可以查看 foo.d 和 foo.a 之间的地址差异)。这可能吗?

【问题讨论】:

  • 正确的术语是“成员”,而不是“属性”。顺便说一句,我想不出这些信息有什么用处。你打算用它做什么?你有可能有XY problem吗?
  • @KeithThompson 注意到了,谢谢。
  • @KeithThompson 是的,我可能有 XY 问题。考虑到我原来的问题有答案,我会更多地考虑这一点。可能我不需要 offsetof。

标签: c struct


【解决方案1】:
offsetof(Foo, d) - offsetof(Foo, a)

offsetof 为您提供从Foo 开头到指定成员的偏移量。

你需要#include <stddef.h>

【讨论】:

  • 不管怎样,offsetof 是一个非常臭的宏,通常表明你在做一些邪恶的事情。
  • @DavidG 是的,我实际上打算将它用于一些充满 void* 铸造的黑魔法巫术之类的(我不是在开玩笑)。你的嗅觉无可挑剔:-)
  • @David G:恰恰相反。 “一些邪恶的事情”将试图手动实现offsetof(就像人们经常出于某种无法解释的原因所做的那样)。 “成员偏移”的概念非常有用,以至于在 C++ 中它甚至被泛化并变成了核心语言特性——指向成员类型的指针。在 C 中,我们只有 offsetof 用于此目的。只要使用标准宏,它就没有任何恶意(按照 C 标准)。
  • @DavidG offsetof 在编写“containerof”宏时是必不可少的,这是在 C 中实现列表所必需的,其中节点嵌入在结构中
  • @Ancurio,你的描述是我想要做的。我正在尝试实现一个通用容器,用户在其中提供一块内存,然后将其细分。簿记信息与数据保存在同一块内存中(很像您的示例)。我还不知道我是否有 XY 问题,或者我什至需要 offsetof。令人惊奇的是你们都对我的问题如此了解(我觉得我不是站在巨人的肩膀上,而是在他们的脚步后面走好几英里。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多