在Linux中使用Offsetof

时间:2011-10-16 13:09:55

标签: c linux

我正在研究在给定结构中如何找到特定变量的偏移量。

我尝试了以下程序。

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;
}

我只想知道offset = (unsigned int) &((struct info *) 0)->d行的工作原理。 因为解除引用0而感到困惑。

2 个答案:

答案 0 :(得分:5)

它不是真的解除引用0,虽然看起来像它。如果某个成员的地址在地址0被取消引用,那么它确实需要地址。

这是一种肮脏的黑客攻击(加上一些令人讨厌的宏观内容),但它会让你感兴趣的是(结构中成员的偏移量)。

执行相同操作的更“正确”的方法是生成有效对象,获取其地址,并获取成员的地址,然后减去这些。使用空指针执行相同操作并不是很好,但可以在不创建对象和减去任何内容的情况下工作。

答案 1 :(得分:1)

你实际上并没有取消引用0.你正在添加零和成员的偏移量,因为你正在取表达式的地址。也就是说,如果 off 是成员的偏移量,那么你正在做

0 + off

*(0 + off)

所以你永远不会真正进行内存访问。