1、前言

在C语言的结构体中,由于字节对齐的问题,所以成员的地址并不能直接根据数据类型的大小进行计算,使用宏offsetof可以获得结构体成员相对于结构体首地址的字节偏移量。

2、offsetof宏实现

在C标准库中offsetof的声明如下,需要包含头文件:

size_t offsetof(type, member);

参数:

type:结构体类型

member:结构体中成员的名称

返回值:

返回类型为size_t的值,表示type中member的偏移量

该宏在Linux内核源码内的实现如下:

#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

通过上面这个宏为什么能获取到结构体某个成员的偏移地址呢?首先,偏移地址的计算方法为:

当前的成员地址-结构体首地址=偏移地址

在offsetof宏中,将0地址强制转换成了(TYPE *)类型,也就是说结构体的首地址为0,所以根据偏移地址计算方法,可以知道当前成员的地址也就等于偏移地址,所以宏offsetof将成员的地址取出并返回,获得的就是某个成员的偏移地址了,返回值为size_t类型,需要引起一定的注意。

3、实例

下面是一个offsetof的使用实例,代码如下所示:

#include

#include

#include

struct s {

int i;

char c;

double d;

char a[];

};

int main(int argc, char *argv[])

{

printf("sizeof(struct s)=%zd\n", sizeof(struct s));

printf("offsets: i=%zd; c=%zd; d=%zd; a=%zd.\n",

offsetof(struct s, i), offsetof(struct s, c),

offsetof(struct s, d), offsetof(struct s, a));

exit(EXIT_SUCCESS);

}

使用gcc编译后运行结果如下所示:

由于字节对齐的原因,所以结构体s的大小为16个字节,假设结构体首地址从0开始,由于int类型占用4字节,所以地址0到3为变量i所用,char类型占用1字节,地址4为变量c所用,由于需要字节对齐并且double类型的开始地址必须是8的整数倍,因此地址5到7被填充,double类型占用8字节,地址8到15被变量d所用,a的地址则从地址16开始,因此,通过宏offsetof便可以得到结构体成员的偏移地址。

参考:

https://www.runoob.com/cprogramming/c-macro-offsetof.html

https://www.cnblogs.com/litifeng/p/7685378.html

container_of宏定义分析---linux内核

问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of宏定义在[include/linux/kernel.h]中:/*_** container_of - cast a ...

剖析linux内核中的宏-----------offsetof

offsetof用于计算TYPE结构体中MEMBER成员的偏移位置. #ifndef offsetof#define offsetof(TYPE, MEMBER) ((size_t) &((T ...

linux内核container_of宏定义分析

看见一个哥们分析container_of很好,转来留给自己看 一.#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMB ...

《linux 内核全然剖析》 笔记 CODE_SPACE 宏定义分析

在memory.c里面.遇到一个宏定义,例如以下: #define CODE_SPACE(addr) ((((addr)+4095)&~4095) < \ current->sta ...

宏&lowbar;CRTIMP分析

CRTIMP是C run time implement的简写,C运行库的实现的意思. 作为用户代码,不应该使用这个东西. 该参数决定 运行时 到底用 动态链接库 还是静态链接 #ifndef _CRT ...

C语言-宏定义与使用分析

1.C语言中的宏定义 #define是预处理器处理的单元实体之— #define定义的宏可以出现在程序的任意位置 #define定义之后的代码都可以使用这个宏 2.定义宏常量 #define定义的宏常 ...

C语言笔记(结构体与offsetof、container&lowbar;of之前的关系)

关于结构体学习,需要了解:结构体的定义和使用.内存对齐.结构体指针.得到结构体元素的偏移量(offsetof宏实现) 一.复习结构体的基本定义和使用 typedef struct mystruct { ...

linux内核中socket的创建过程源码分析(详细分析)

1三个相关数据结构. 关于socket的创建,首先需要分析socket这个结构体,这是整个的核心. 104 struct socket { 105         socket_state       ...

嵌入式C语言自我修养 04:Linux 内核第一宏:container&lowbar;of

4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型 ...

随机推荐

非maven项目导入idea几点心得总结

这个问题一共有3种解决办法1. 你下载好的文件应该是src 和Webcontent是在同一个目录下的.只要把Webcontent放入到src下就行.这种就变成maven的目录结构.因为你这个目录结构应 ...

Yii-数据模型- rules类验证器方法详解

public function rules(){ return array( array('project_id, type_id, status_id, owner_id, requester_id ...

在不同平台上CocosDenshion所支持的音频格式

在大多数平台上,cocos2d-x调用不同的SDK API来播放背景音乐和音效.CocosDenshion在同一时间只能播放一首背景音乐,但是能同时播放多个音效. 背景音乐 Platform supp ...

python手记&lpar;51&rpar;

python通过声音将文件内容隐藏,实现原理是将文件的内容分别插入到声音文件的不同位置中做为当次采样的数据,目前是对英文文本文档加解密 #!/usr/bin/env python # -*- codi ...

RSA原理、ssl认证、Tomcat中配置数字证书以及网络传输数据中的密码学知识

情形一:接口的加.解密与加.验签 rsa不是只有加密解密,除此外还有加签和验签.之前一直误以为加密就是加签,解密就是验签.这是错误的! 正确的理解是: 数据传输的机密性:公钥加密私钥解密是密送,保 ...

iOS日历中给一个事件添加多个提醒

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) iOS自带的日历应用中,我们最多只能给一个事件设置2个提醒,但 ...

mysql学习3

1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引, 会保存在额外的文件中. 作用: 约束 加速查找 1.1.建立索引 a.额外的文件保存特殊的数据结构 ...

&OpenCurlyDoubleQuote;字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛 1010 Count

思路:矩阵快速幂.推一下初始矩阵就好了 #include #define LL long long #define fi first #define se s ...

网卡phy9161A

硬件1. 网口网口使用4根信号线:两根发送,两根接收.一对信号线中一根承载0——+2.5V信号电压,而另一根负载的电压是0——-2.5V,因此可产生一个5Vpp的信号差.RJ45中有用的就是4根信号线 ...

更快写入的落脚点不是线程数而是mysql连接数 对数据库 批处理 批写入

批提交mysql 单线程的批提交 nohup  python fromRedisoToMysqlSingleThreadOneConnBatchInsert.py 100 10.24.192.192 ...

pythonmainoffset_宏offsetof分析相关推荐

  1. c语言 offsetof函数,C 库宏 - offsetof()函数

    宏offsetof 标准库stddef.h 定义 size_t offsetof(type, member); 分析 C 库宏 offsetof(type, member) 会生成一个类型为 size ...

  2. 【C语言】宏offsetof的模拟实现 (计算结构体中某变量相对于首地址的偏移)

    首先我们应该特别留意 : offsetof 是一个宏,并非是一个函数 ! 宏offsetof的介绍 : 参数:第一个是结构体类型名称,第二个是结构体成员名 返回类型:size_t无符号整形 引用的头文 ...

  3. Nature 子刊:三代测序的DNA提取和宏基因组学分析

    改进的人类肠道微生物组的高分子量DNA提取,纳米孔测序和宏基因组学装配 Improved high-molecular-weight DNA extraction, nanopore sequenci ...

  4. C库宏-offsetof()

    在项目开发过程中,发现了offsetof()函数,随即查询了此函数,摘录如下: C库宏 - offsetof() 描述 C库宏offsetof(type, member-designator)会生成一 ...

  5. C/C++编程:宏offsetof()

    理论 C 库宏 offsetof(type, member-designator) 会生成一个类型为 size_t 的整型常量,它是一个结构成员相对于结构开头的字节偏移量.成员是由 member-de ...

  6. container_of宏定义分析---linux内核

    问题:如何通过结构中的某个变量获取结构本身的指针??? 关于container_of宏定义在[include/linux/kernel.h]中: /*_* * container_of - cast ...

  7. Gooogle Test中的TEST()宏代码分析

    从Primer文档中了解到,一般情况下,在TEST()宏定义一个自己的测试案例,第一部分为单元测试名字,第二部分为测试名.那么TEST()宏的原定义是一个什么样的形式的呢?为什么只需要定义TEST() ...

  8. 对宏offsetof理解

    #ifndef offsetof #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER) #endif offset这个 ...

  9. 对 jiffies 溢出、 系统滴答数ticks、time_after 宏的分析理解

    (转载请注明出处:http://blog.csdn.net/gujintong1110/article/details/44504343) 最近用到了tick timer系统滴答计时器,遇到了溢出的问 ...

最新文章

  1. buffer IO和direct IO
  2. 关于学习tf.random.normal()和tf.random.uniform()的一点小总结
  3. 服务器与浏览器数据传输过程中编码问题
  4. 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 )
  5. 【Android 逆向】Android 进程注入工具开发 ( 调试进程中寄存器的作用 | 通过 EIP 寄存器控制程序运行 | EIP 寄存器的存档与恢复 )
  6. 泛珠三角计算机作品大赛2018,2018年泛珠三角大学生计算机作品赛广西赛区选拔赛圆满结束...
  7. 【数据结构与算法】之链表的操作和使用
  8. [软件推荐]使用OneNote来构建你自己的知识库(OFFICE2010)
  9. LeetCode MySQL 618. 学生地理信息报告(row_number)
  10. @程序员,幼儿园小班都在学 AI,就问你慌不慌?
  11. java this关键字的使用_做java两年了,构造方法和方法重载还是搞不明白?一文帮你搞定...
  12. CISCO、JUNIPER网络技术训练中心ITAA等级四(RS)学习计划蓝图(version 1.0)
  13. 广东开放大学学习指南
  14. pcl_view简单使用
  15. Android实现边录音边播放
  16. 世界 6 大航空动力巨头企业
  17. labelimage使用过程bug
  18. 福禄克FLUKE TIX650红外热像仪3.5英寸高像素大屏
  19. 如何关闭计算机的wps云文档,怎么把wps云文档关掉
  20. 外国文学最佳中译本合集-选

热门文章

  1. ios怎么更新测试软件,iOS12测试版怎么更新正式版 ios 12测试版升正式版
  2. Pyecharts Geo绘制可视化地图并展示坐标位置
  3. ubuntu安装无线网卡驱动(包括离线安装)
  4. asis2016_b00ks
  5. HDU------1248不死族的巫妖王
  6. 2022安全员-C证考试模拟100题模拟考试平台操作
  7. 将过账期间变式分配给公司代码
  8. 自媒体人的福音,比今日热榜还实用的热点工具来了——全网热点直达
  9. 《神经质人格》摘录(第十章)
  10. HP打印机查看耗材余量