我正在研究在给定结构中如何找到特定变量的偏移量。
我尝试了以下程序。
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而感到困惑。
答案 0 :(得分:5)
它不是真的解除引用0
,虽然看起来像它。如果某个成员的地址在地址0
被取消引用,那么它确实需要地址。
这是一种肮脏的黑客攻击(加上一些令人讨厌的宏观内容),但它会让你感兴趣的是(结构中成员的偏移量)。
执行相同操作的更“正确”的方法是生成有效对象,获取其地址,并获取成员的地址,然后减去这些。使用空指针执行相同操作并不是很好,但可以在不创建对象和减去任何内容的情况下工作。
答案 1 :(得分:1)
你实际上并没有取消引用0.你正在添加零和成员的偏移量,因为你正在取表达式的地址。也就是说,如果 off 是成员的偏移量,那么你正在做
0 + off
不
*(0 + off)
所以你永远不会真正进行内存访问。