offsetof宏的原理以及作用

简介: 原理:虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。作用:为接下来的container_of宏的讲解出现做铺垫offsetof宏: #define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)接下来看看例程就明白了,其实这个宏挺简单的,&((TYPE *)0)->MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。

原理:

虚拟一个TYPE类型的结构体变量,通过TYPE.MEMBER的方式来访问MEMBER成员,进而得到MEMBER成员相对于整个结构体首地址的偏移量。

作用:为接下来的container_of宏的讲解出现做铺垫

offsetof宏: #define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)

接下来看看例程就明白了,其实这个宏挺简单的,&((TYPE *)0)->MEMBER其实相当于得到了成员的偏移减去0地址偏移,也就是结构体的首地址,进而就得到了该成员相当于整个结构体的偏移量。

#include <stdio.h>
#define offsetof(TYPE,MEMBER) ((int) &((TYPE *)0)->MEMBER)
#pragma pack(4)
struct ptr
{
	char a ; 
	short b ; 
	int  c ; 
	double d ;
};
#pragma pack()
int main(void)
{
	struct ptr Pt ;
	printf("ptr:%d\n",sizeof(struct ptr));//16
	
	//相对地址偏移量 
	int offset = offsetof(struct ptr,a);  //0
	printf("offset:%d\n",offset);
	int offset1 = offsetof(struct ptr,b); //2
	printf("offset1:%d\n",offset1);
	int offset2 = offsetof(struct ptr,c); //4
	printf("offset2:%d\n",offset2);
	int offset3 = offsetof(struct ptr,d); //8
	printf("offset3:%d\n",offset3);
	return 0 ;
}





目录
相关文章
|
2月前
|
C语言
【C语言】库宏offsetof(结构体成员偏移量计算宏)
【C语言】库宏offsetof(结构体成员偏移量计算宏)
18 0
|
5月前
|
NoSQL 安全 Linux
C++ | 对比inline内联函数和宏的不同点-1
C++ | 对比inline内联函数和宏的不同点
38 1
|
2月前
|
编译器 C语言
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
C语言宏定义(#define定义常量​、#define定义宏​、 带有副作用的宏参数、 宏替换的规则、 宏函数的对比)
|
2月前
#define定义常量和宏
#define定义常量和宏
13 0
|
3月前
|
Linux
offsetof宏与container_of宏
offsetof宏与container_of宏
12 0
|
4月前
用一行代码实现宏offsetof
用一行代码实现宏offsetof
|
5月前
|
编译器
#define 宏定义看这一篇文章就够了
#define 宏定义看这一篇文章就够了
126 0
|
5月前
|
编译器 Android开发 C语言
C++ | 对比inline内联函数和宏的不同点-2
C++ | 对比inline内联函数和宏的不同点
33 1
|
8月前
|
编译器
#define 定义常量和宏
工作机理:直接替换,以下列代码为例编译器直接将用到max的地方替换为100
39 0
|
9月前
|
C++
C++宏 #与##的区别
C++宏 #与##的区别
35 0