我有:
class Foo {
int a;
int b;
std::string s;
char d;
};
现在,我想知道给定Foo *
的a,b,s,d的偏移量即。假设我有:
Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ; // what expression should I put in ?
答案 0 :(得分:7)
我不确切地知道为什么你想要一个成员偏移到你的struct
,但偏移量是允许在给定结构地址的情况下获得指向成员的指针。 (请注意,标准offsetof
宏仅适用于POD结构(不属于您),因此这里的答案不合适。)
如果这是你想要做的,我会建议使用指向成员的指针,因为这是一种更便携的技术。 e.g。
int main()
{
int Foo::* pm = &Foo::b;
// Pointer to Foo somewhere else in the program
extern Foo* f;
int* p = &(f->*pm);
}
请注意,这仅在b
中Foo
不是私有的情况下才有效,或者您可以在成员函数或Foo
的朋友中形成指向成员的指针。
答案 1 :(得分:1)
您应该考虑结构内部的偏移量是编译器相关的。不同的编译器不仅可以在结构的末尾添加填充零或不填充,甚至在结构的中间(尽管我认识到这种情况更为罕见)。即,直接使用偏移量而不是以“标准方式”访问成员的结果是未定义的行为。
Charles Balley给出的解决方案更明智。无论如何,我不太明白你的问题的最终目标是什么。具体地,
Foo *foo = new Foo();
(char*) foo->b == (char*) foo + ?? ;
对我来说根本没有意义。你想在foo中分配foo-> b;它自己的偏移吗?
也许你要做的是在foo中使用b作为char *,在这种情况下问题是:
Foo *foo = new Foo();
char* ptr == (char*) foo + ?? ;
也许你有时想把b当作int,有时候把它当作char *,在这种情况下,你可以尝试进行以下更改(假设你只是忘了公开):
class Foo {
public:
int a;
union b {
int intB;
char * chrB;
}
int c;
// ...
};