1赞

评论

收藏

[C++] 关于c语言结构体偏移的一点思考(二)

编程语言 编程语言 发布于:2021-06-30 11:08 | 阅读数:451 | 评论:0

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

  
关注下面的标签,发现更多相似文章