通过宏函数计算结构体成员偏移量
编译器在为结构体成员分配内存时,由于存在内存对齐机制,各个成员所占空间可能不是连续的,因而不能简单的通过成员类型所占的字长来推断其它成员或结构体对象的地址。
获得结构体成员偏移量的方法可以参照博客:
https://blog.csdn.net/zhanshen2015/article/details/51500757
现在主要以第二种方法(通过宏函数计算结构体成员偏移量)为例,做简单整理和介绍
(注:typeof还没有写进C++标准,只是gcc里面的,但C++引入了decltype和auto关键字,如果是用C++编写的代码,则可以用decltype(c++ 11)替代typeof)
如果你仅仅是想根据初始化值为一个变量推断合适的数据类型,那么使用auto是一个更加简单的选择。当你只有需要推断某个表达式的数据类型,例如某个函数调用表达式的计算结果的数据类型,而不是某个变量的数据类型时,你才真正需要delctype。具体可以参考博客:
http://blog.csdn.net/fjb2080/article/details/7527244
gcc编译:
#include <stdio.h>#define GET_OFFSET(data,member) (size_t)(&(((typeof(data)*)0)->member))typedef struct student{int a;char ch[2];double d;
}student_t;int main(int argc, char const *argv[])
{student_t stu ;int offset ;offset= GET_OFFSET(stu, d);printf("%d\n",offset );return 0;
}
代码分析如下:
1. typeof 关键字:
用于获取修饰修饰变量的数据类型。比如 int value; typeof( value ) 的作用是获得 value 的数据类型int 。
用法:
int value; 我想要定义一个 和value这个变量类型一样的新变量new_value ;
操作像这样: typeof(value) new_value ;
该用法可以用在函数的值传递中,在不知道值的类型的时候,可以定义和它类型相同的新变量。
2. typedef :
为数据类型起一个名字 :比如 typedef struct student student_t ;
约定 :一般新名字后面以 _t 结尾,表示是一个构造出来的新类型名字,便于理解。
student_t stud1 ; 等价于 struct student stud1 ; 很显然 前者更有利于移植和阅读。
3. ((data_type )0)
作用:把数字 0 强制转换成 (data_type) 类型的指针。
比如:( struct student * )0 的作用是把 0 转换成 struct student类型的指针,用于引用struct student数据类型类型的成员。
在这个题目中: ((typeof(data)*)0)->member 的目的是 把 0 转成 data 变量对应的数据类型的指针,然后通过该指针引用该类型的成员的值。
对于本题而言: (size_t)(&(((struct student *)0)->d)) : & 用以获取struct student结构的成员d ,然后,获得d 的地址,将它转成 size_t 的数据类型量。
其中 size_t 的定义是 typedef unsigned int size_t ;
(size_t)(&(((struct student *)0)->d)) 它的值是变量d的地址,为什么是偏移值呢? 因为 起始地址我们认为规定为 0。
4. size_t :
typedef unsigned int size_t ;
原文:https://blog.csdn.net/baidu_33725271/article/details/69323694
C++编译:
#include<iostream>using namespace std;#define GET_OFFSET(data,member) (size_t)(&(((decltype(data)*)0)->member))struct student{int a;char ch[2];double d;
};int main(int argc, char const *argv[])
{struct student stu;int offset;offset = GET_OFFSET(stu, d);cout << offset << endl;return 0;
}
通过宏函数计算结构体成员偏移量相关推荐
- 【C 语言】结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
文章目录 一.指针运算 与 指针内存操作 二.结构体偏移量计算 一.指针运算 与 指针内存操作 指针变量算术运算 ( 指针可以是任意值 ) : 指针 是一个变量 , 如果对指针进行 算术 / 逻辑 等 ...
- 关于Visual Assistant X助手在定位函数及结构体成员变量不准确的问题
我们在使用VS开发程序时,习惯使用Visual Assistant X助手来协助我们工作.Visual Assistant X确实给我们带来了很多的便利和好处,但是在有些情况下,也会给我们带来一些问题 ...
- C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐
文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...
- 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)
首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 ! 宏offsetof的介绍 : 参数:第一个是结构体类型名称,第二个是结构体成员名 返回类型:size_t无符号整形 引用的头文 ...
- C语言中利用宏,实现一个整数的奇数位和偶数位交换,以及计算结构体中某变量相对于首地址的偏移
C语言中的自定义宏 自定义宏,令其实现所需功能 1.写一个宏,可以将一个整数字的奇数位和偶数位交换. 2.写一个宏,计算结构体中某变量相对于首地址的偏移. 具体思路1: 首先取出当前数的奇数部分和偶数 ...
- C语言结构体成员有函数的定义与使用
```c#include <stdio.h> typedef int (*FunHandle)(int, int); //定义 指向函数的指针 struct Example {int a; ...
- 宏定义来实现一个结构体成员相对于该结构体首地址的偏移量
#define my_offerset(type , exp) ((int)&(((type*)0)->exp))//因为是求结构体的成员内存偏移.结构体会定义一种新的数据类型 所以ty ...
- C++ 结构体、成员函数、结构体指针的使用
#include <iostream> using namespace std;struct st_girl {string name;int age;void setvalue(stri ...
- printf 打印结构体成员函数出错原因分析
定义一个结构体: unsigned char data[] = {0x00,0x00,0xFF,0xFB,0x00,0xFF,0xFB} typedef struct serial_data{unsi ...
最新文章
- 美团一面,看看你能否回答上来?
- Gut:人体口腔菌群的稳定性和动态变化规律
- Post with HttpClient
- 计算机二级考试办公室高级应用考点,2018年计算机二级Office高级应用考点:PowerPoint...
- C#让两个长度相同的数组一一对应
- Bitcoin代码中的Boost signals(1)
- Linux之特殊权限(SUID/SGID/SBIT)
- 没想到你是这样的直播研发骚年
- 如何隐藏地址栏中的真实地址_Firefox推出Private Relay插件:可隐藏真实邮箱地址...
- python回声程序 一行代码_python实现的比较完成的带声音的摩斯码翻译程序的代码...
- 抗衰老,吃这些食物越来越年轻
- Linux设备驱动与整个软硬件系统的关系
- android q桌面,Android Q带来全新桌面模式
- 从Mysql数据库中导入导出表结构
- linux添加环境变量并生效,linux(ubtuntu)添加环境变量,立即生效
- Object-C语法
- python语言的多行注释以什么开头和结尾_python多行注释
- 神舟笔记本怎么进入bios?神舟笔记本bios设置U盘启动教程
- AIGC基础:从VAE到DDPM原理、代码详解
- 局域网内固定自己的ip