Linux中使用的Offsetof
收藏

我正在研究如何在给定的结构中找到特定变量的偏移量。
我试过下面的程序。

struct info{
char a;
int b;
char c;
int d;
};

struct info myinfo;

int main(int argc, char **argv)
{
struct info *ptr = &myinfo;
unsigned int offset;

offset = (unsigned int) &((struct info *) 0)->d;
printf("Offset = %d\n",offset);

return 0;
}

我只想知道这条线是怎么工作的。
因为0的解引用,我感到困惑。


最佳答案:

它并没有真正取消引用0,尽管它看起来像。如果在地址0处解引用了某个成员的地址,则它实际上会取该成员的地址。
这是一种肮脏的黑客(加上一些讨厌的宏),但它能让你感兴趣(结构中成员的偏移量)。
一个更“正确”的方法是生成一个有效的对象,获取它的地址,获取成员的地址,然后减去这些。对空指针执行相同的操作并不都很漂亮,但可以在不创建对象和减去任何内容的情况下工作。

公众号