获取结构体某成员偏移
本身这个问题非常简单,直接用地址差值即可求得,最近在某本书上看到了一个非常牛的方法,第一次看还将信将疑觉得不太可能,后面上机验证发现确实可以,代码如下:
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
获取结构体某成员偏移相关推荐
- c语言 typeof 结构体,Go语言通过反射获取结构体的成员类型
任意值通过 reflect.TypeOf() 获得反射对象信息后,如果它的类型是结构体,可以通过反射值对象(reflect.Type)的 NumField() 和 Field() 方法获得结构体成员的 ...
- Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。...
倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...
- Go的反射是如何获取结构体成员信息的?
前言 哈喽,大家好,今天这篇文章的目的主要是解答一位读者的疑问,涉及知识点是反射和结构体内存布局.我们先看一下读者的问题: img 我们通过两个问题来解决他的疑惑: 结构体在内存中是如何存储的 反射获 ...
- JNA嵌套结构体,如何访问内嵌结构体的成员?
如果不明白如何创建DLL动态链接库项目,可参照文章:https://blog.csdn.net/Xeon_CC/article/details/124873221 提出问题: C语言程序有个结构体叫B ...
- 获取结构体中变量的偏移量
C/C++获取结构体中变量的偏移量 1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置. 通常的做法就是定义一个宏变量,如下: #define OFFSET(structure, memb ...
- C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)
获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...
- 结构体全局变量成员赋值
struct s {int a; };s g;g.a = 1; // 编译错误void f() {g.a = 1; // 编译正确 } 为什么全局结构体变量成员只能在函数内调用? 因为g.a=1是赋值 ...
- struct结构体扩展-成员函数
struct结构体扩展-成员函数 在C++中,允许在结构中定义函数,该函数被称为成员函数,描述形式如下: struct 结构名{数据成员成员函数 } 例题描述: 输入n个学生的信息,每个学生信息包括姓 ...
- 作为成员的结构体(作为结构体的成员的结构体)
最近几日,有不少的读者咨询有关结构体的问题!再加上笔者最近在学习结构体的深层问题,所以,打算书写几个博客,来帮助一些读者来解决部分问题!!不敢自托大!!哎! 在之前,我们就已经对于结构体有着接触!所以 ...
最新文章
- 常用几种激活函数的总结
- HESSIAN 海森矩阵
- 人工智能落地之路:从概念验证到产品
- [转]oracle临时表相关知识
- Sql字符串分组Split函数的两种实现方法
- ajax 使用 JSONP 时,只能 GET 不能 POST
- 【评分】第三次作业-团队展示
- Razor Page–Asp.Net Core 2.0新功能 Razor Page介绍
- react hooks_React Hooks简介
- 如何获取下拉框lable的数据_如何使用Python获取指定股票的日K线数据?
- jQuery 实现菜单
- RxJS异步编程的简介
- 传输线模型(分布参数模型)
- matlab绘直方图,[转载]matlab中函数bar绘制直方图
- on duplicate mysql_mysql 避免重复写入数据的三种方式 和insert ...on duplicate updt... 死锁...
- uvm中uvm_event, uvm_event_pool的用法
- 【Android】图形图像处理
- Flink HA配置
- XML文档定义有几种方式?它们之间有何本质区别?解析XML文档有哪几种方式?
- CSS基础班笔记(二)
热门文章
- python构造函数_Python构造函数
- wifi频率和zigbee干扰_浅谈ZigBee和Wi—Fi的共存和干扰
- 表单中Readonly和Disabled的区别
- 科学计算机怎么编程游戏,官泄 可编程科学计算器开发游戏
- https post 报400地址匹配不正确_如何发布领英动态post/article?
- eclipse插件开发(四) 流程图绘制插件(雏形)
- 人人网 api2.0 java_API2.0文档
- oracle表段是什么,【DB笔试面试274】在Oracle中,什么是延迟段创建(Deferred Segment Crea......
- oracle 日期转换成毫秒数,ORACLE:毫秒与日期的相互转换,获取某天的信息
- 网站部署到云服务器需要哪些文件,云服务器能部署哪些应用?怎么部署?