本身这个问题非常简单,直接用地址差值即可求得,最近在某本书上看到了一个非常牛的方法,第一次看还将信将疑觉得不太可能,后面上机验证发现确实可以,代码如下:

  

1 #include <iostream>
2
3  using namespace std;
4
5
6  struct test
7 {
8 int a;
9 int b;
10 char c;
11 int d;
12 };
13
14 #define FIND(structTest,e) (size_t)&(((structTest*)0)->e)
15
16 int main()
17 {
18 size_t s = FIND(test,b);
19 //test t;
20 cout<<s<<endl;
21
22 char c;
23 cin>>c;
24 return 0;
25 }

  仔细看第14行代码,发现这个宏非常奇怪,没错,就是用来求偏移的。我们知道宏的本质是替换,在预编译的时候会替换代码,那么里面有什么玄机了?我发现其实此法是用了欺骗编译器的技巧来求得偏移的。取地址符‘&’决定表达式不会出现访问内存错误,因为默认0强制转化为结构体指针类型后是不能访问的地址,由于有地址符,所以不会实际产生访问变量的代码。而‘->’最本质的就是队0加上后面变量在结构体中的偏移,这样 “0 + 偏移”就求得了我们要求的值。感觉此代码非常巧妙,虽然不免有人说是愚弄编译器的伎俩,但是记下无妨,仍然觉得此法的甚妙。

转载于:https://www.cnblogs.com/HappyAngel/archive/2010/10/29/1864856.html

获取结构体某成员偏移相关推荐

  1. c语言 typeof 结构体,Go语言通过反射获取结构体的成员类型

    任意值通过 reflect.TypeOf() 获得反射对象信息后,如果它的类型是结构体,可以通过反射值对象(reflect.Type)的 NumField() 和 Field() 方法获得结构体成员的 ...

  2. Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。...

    倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...

  3. Go的反射是如何获取结构体成员信息的?

    前言 哈喽,大家好,今天这篇文章的目的主要是解答一位读者的疑问,涉及知识点是反射和结构体内存布局.我们先看一下读者的问题: img 我们通过两个问题来解决他的疑惑: 结构体在内存中是如何存储的 反射获 ...

  4. JNA嵌套结构体,如何访问内嵌结构体的成员?

    如果不明白如何创建DLL动态链接库项目,可参照文章:https://blog.csdn.net/Xeon_CC/article/details/124873221 提出问题: C语言程序有个结构体叫B ...

  5. 获取结构体中变量的偏移量

    C/C++获取结构体中变量的偏移量 1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置. 通常的做法就是定义一个宏变量,如下: #define OFFSET(structure, memb ...

  6. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

  7. 结构体全局变量成员赋值

    struct s {int a; };s g;g.a = 1; // 编译错误void f() {g.a = 1; // 编译正确 } 为什么全局结构体变量成员只能在函数内调用? 因为g.a=1是赋值 ...

  8. struct结构体扩展-成员函数

    struct结构体扩展-成员函数 在C++中,允许在结构中定义函数,该函数被称为成员函数,描述形式如下: struct 结构名{数据成员成员函数 } 例题描述: 输入n个学生的信息,每个学生信息包括姓 ...

  9. 作为成员的结构体(作为结构体的成员的结构体)

    最近几日,有不少的读者咨询有关结构体的问题!再加上笔者最近在学习结构体的深层问题,所以,打算书写几个博客,来帮助一些读者来解决部分问题!!不敢自托大!!哎! 在之前,我们就已经对于结构体有着接触!所以 ...

最新文章

  1. 常用几种激活函数的总结
  2. HESSIAN 海森矩阵
  3. 人工智能落地之路:从概念验证到产品
  4. [转]oracle临时表相关知识
  5. Sql字符串分组Split函数的两种实现方法
  6. ajax 使用 JSONP 时,只能 GET 不能 POST
  7. 【评分】第三次作业-团队展示
  8. Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍
  9. react hooks_React Hooks简介
  10. 如何获取下拉框lable的数据_如何使用Python获取指定股票的日K线数据?
  11. jQuery 实现菜单
  12. RxJS异步编程的简介
  13. 传输线模型(分布参数模型)
  14. matlab绘直方图,[转载]matlab中函数bar绘制直方图
  15. on duplicate mysql_mysql 避免重复写入数据的三种方式 和insert ...on duplicate updt... 死锁...
  16. uvm中uvm_event, uvm_event_pool的用法
  17. 【Android】图形图像处理
  18. Flink HA配置
  19. XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?
  20. CSS基础班笔记(二)

热门文章

  1. python构造函数_Python构造函数
  2. wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
  3. 表单中Readonly和Disabled的区别
  4. 科学计算机怎么编程游戏,官泄 可编程科学计算器开发游戏
  5. https post 报400地址匹配不正确_如何发布领英动态post/article?
  6. eclipse插件开发(四) 流程图绘制插件(雏形)
  7. 人人网 api2.0 java_API2.0文档
  8. oracle表段是什么,【DB笔试面试274】在Oracle中,什么是延迟段创建(Deferred Segment Crea......
  9. oracle 日期转换成毫秒数,ORACLE:毫秒与日期的相互转换,获取某天的信息
  10. 网站部署到云服务器需要哪些文件,云服务器能部署哪些应用?怎么部署?