如何从指向某个成员的指针获取指向对象的指针?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

假设有一个结构

struct Thing {
  int a;
  bool b;
};

我得到一个指向成员的指针b作为某种函数的参数:

void some_function (bool * ptr) {
  Thing * thing = /* ?? */;
}

如何获得指向包含对象的指针?最重要的是:在不违反标准中的某些规则的情况下,我想要标准定义的行为,而不是未定义的或实现定义的行为。

提问于
用户回答回答于

如果你确定指针真的指向b结构中的成员,就像有人做过一样

Thing t;
some_function(&t.b);

那么你应该能够使用这个offsetof宏来获得一个指向结构体的指针:

std::size_t offset = offsetof(Thing, b);
Thing* thing = reinterpret_cast<Thing*>(reinterpret_cast<int8_t*>(ptr) - offset);

请注意,如果指针ptr实际上没有指向Thing::b成员,那么如果使用指针,上面的代码将导致未定义的行为thing

用户回答回答于
void some_function (bool * ptr) {
  Thing * thing = (Thing*)(((char*)ptr) - offsetof(Thing,b));
}

扫码关注云+社区