#include <iostream>
using namespace std;
struct A {unsigned char _data;};
struct B {unsigned char _data;};
struct C {A a; B b;};
C& get_parent(A& ar)
{
return *reinterpret_cast<C*>(reinterpret_cast<char*>(&ar) - offsetof(C, a));
}
B& get_sister(A& ar)
{
return get_parent(ar).b;
}
int main() {
C c;
cout << "&c = " << &c << endl;
cout << "&c.a = " << &(c.a) << endl;
cout << "&c.b = " << &(c.b) << endl;
A& ar = c.a;
cout << "&ar = " << &ar << endl;
B& br = get_sister(ar);
cout << "&br = " << &br << endl;
C& cr = get_parent(ar);
cout << "&cr = " << &cr << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEEge3Vuc2lnbmVkIGNoYXIgX2RhdGE7fTsKc3RydWN0IEIge3Vuc2lnbmVkIGNoYXIgX2RhdGE7fTsKc3RydWN0IEMge0EgYTsgQiBiO307CgpDJiBnZXRfcGFyZW50KEEmIGFyKQp7CglyZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcikgLSBvZmZzZXRvZihDLCBhKSk7Cn0KCkImIGdldF9zaXN0ZXIoQSYgYXIpCnsKCXJldHVybiBnZXRfcGFyZW50KGFyKS5iOwp9CgppbnQgbWFpbigpIHsKCUMgYzsKCWNvdXQgPDwgIiZjID0gIiA8PCAmYyA8PCBlbmRsOwoJY291dCA8PCAiJmMuYSA9ICIgPDwgJihjLmEpIDw8IGVuZGw7Cgljb3V0IDw8ICImYy5iID0gIiA8PCAmKGMuYikgPDwgZW5kbDsKCQoJQSYgYXIgPSBjLmE7Cgljb3V0IDw8ICImYXIgPSAiIDw8ICZhciA8PCBlbmRsOwoJCglCJiBiciA9IGdldF9zaXN0ZXIoYXIpOwoJY291dCA8PCAiJmJyID0gIiA8PCAmYnIgPDwgZW5kbDsKCglDJiBjciA9IGdldF9wYXJlbnQoYXIpOwoJY291dCA8PCAiJmNyID0gIiA8PCAmY3IgPDwgZW5kbDsKCglyZXR1cm4gMDsKfQ==