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 ;
}





目录
相关文章
std::cout输出十六进制数据
std::cout输出十六进制数据
311 0
|
消息中间件 数据可视化 Java
Docker Compose:部署SpringBoot应用(含MySQL,Redis,Nacos,RabbitMQ,Nginx)
Docker Compose:部署SpringBoot应用(含MySQL,Redis,Nacos,RabbitMQ,Nginx)
Docker Compose:部署SpringBoot应用(含MySQL,Redis,Nacos,RabbitMQ,Nginx)
|
小程序
【小程序】报错:no such file or directory, access ‘wxfile://usr/miniprogramLog/log2‘
【小程序】报错:no such file or directory, access ‘wxfile://usr/miniprogramLog/log2‘
2269 0
|
XML Java 数据库连接
Spring Boot集成MyBatis
主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。
|
11月前
|
Java 数据库 Spring
services层和controller层
Controller层和Services层是现代Web应用程序中的两个关键层次。Controller层负责处理客户端请求和生成响应,而Services层负责实现业务逻辑和数据操作。通过将职责明确分离,可以提高代码的可维护性、可扩展性和测试性。希望本文能帮助您更好地理解这两个层次及其实现方法,并在实际开发中应用这些最佳实践。
509 1
|
安全 数据库 数据安全/隐私保护
Sql-lab全解_sqllab,给后辈的一点建议
Sql-lab全解_sqllab,给后辈的一点建议
|
数据采集 数据安全/隐私保护 UED
芝麻代理快代理神龙代理天启代理阿布云极光代理?…选代理IP避开这几点
随着代理IP在互联网中的作用愈发重要,其不仅提升了用户体验和隐私保护,还在数据安全、网络爬虫效率、市场研究及内容分发等方面产生了深远影响。然而,如何选择合适的代理IP仍困扰许多人。本文将探讨选择代理IP时应注意的关键点:IP数量并非越多越好,关键在于纯净度与可用率;需关注带宽与速度;不能仅看价格,还需综合考量实际使用效果。通过实际测试,才能找到最适合的服务商。
|
缓存 数据处理 Python
python读取文件到缓存
python读取文件到缓存
235 2
|
编译器 C++ 开发者
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程(二)
【C++ 泛型编程 进阶篇】:用std::integral_constant和std::is_*系列深入理解模板元编程
469 1
pandas list\dict 转换为DataFrame
pandas list\dict 转换为DataFrame
pandas list\dict 转换为DataFrame