微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列博客。

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 总结

在已知结构体某一个成员变量的地址的前提下,可以通过第一讲介绍的技巧,快速获得结构体的起始位置,最终可以得到任意一个变量的地址。





四川旅游学院 where2go 团队




微信号:算法与编程之美          

关于c语言结构体偏移的一点思考(二)_成员变量


长按识别二维码关注我们!


写留言”发表评论,期待您的参与!欢迎转发!