1 问题定义
已知结构体类型定义如下:
struct node_t{ char a; int b; int c; };
int *p_c,该指针指向struct node_t node的成员变量c
结构体1Byte对齐
#pragma pack(1)
求:结构体变量 node的成员变量b的值?
拿到这个问题的时候,我们先做一下简单的分析,题目的意思是根据一个指向某结构体成员变量的指针,求该结构体的另外一个成员变量的值。
2 解决方案
那么可能的几种解法有:
解法一
由于我们知道结构体是1Byte对齐的,所以这道题最简单的解法是:
*(int *)((unsigned long)p_c - sizeof(int))
成员变量c的地址减去sizeof(int)从而得到成员变量b的地址,然后再强制转换为int *,最后再取值最终得到成员变量b的值;
解法二
上述代码虽然简单,但扩展性不够好。我们希望通过p_c直接得到指向该结构体的指针
p_node,然后通过p_node访问该结构体的任意成员变量了。
由此我们得到计算结构体起始地址p_node的思路为:
【成员变量c的地址p_c】减去【c在结构体中的偏移】
通过上一篇的介绍我们得到结构体struct node_t中成员变量c的偏移为:
(unsigned long)&(((struct node_t *)0)->c)
所以我们得到结构体的起始地址指针p_node为:
(struct node_t *)((unsigned long)p_c - (unsigned long)(&((struct node_t *)0)->c))
最后我们就可以使用下面的代码来获取成员变量a,b的值:
p_node->a p_node->b
3 总结
在已知结构体某一个成员变量的地址的前提下,可以通过第一讲介绍的技巧,快速获得结构体的起始位置,最终可以得到任意一个变量的地址。