计算结构体内元素的偏移量宏
Posted ligei
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算结构体内元素的偏移量宏相关的知识,希望对你有一定的参考价值。
#define offsetof(type,member) ((size_t) &((type *)0)->member)
该宏定义含义为:在不生成结构体实例的情况下计算结构体成员的偏移量。
一:结构体变量的某成员的地址等于该结构体变量的基址加上结构体成员变量在结构体中的偏移量
二:#define offsetof(type,member) ((size_t) &((type *)0xff)->member-0xff):这里假设type类结构体的
基地址为0xff,则成员变量number的地址为:0xff+sizeof((type*)->number),成员变量number的偏移量
为成员变量的地址减去结构体的基地址:所以成员变量number的偏移量为((type *)0xff)->member-0xff。
(type*)0:这个结构体变量的基址就是0。所以结构体成员变量的地址的大小在数值上就等于该结构体
成员在结构体中的偏移量。
三:(type*)0:将0地址转换为type*结构体指针。
四:(type *)0)->member:指向type*结构体的成员变量number。
五:&((type *)0)->member:取成员变量number的地址。
六: ((size_t) &((type *)0)->member):将成员变量number的地址转换为size_t类型。可以知道size_t是
无符号整形。
以上是关于计算结构体内元素的偏移量宏的主要内容,如果未能解决你的问题,请参考以下文章
在Golang里如何实现结构体成员指针到结构体自身指针的转换
C 语言结构体 ( 指针运算与指针内存操作 | 结构体成员偏移量计算 )
C 语言结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )