Offsetof

转载 2012年03月24日 19:11:10

#define offsetof(s, m)   (size_t)&(((s *)0)->m)

 

s是一个结构名,它有一个名为m的成员(sm 是宏offsetof的形参,它实际是返回结构s的成员m的偏移地址.

 

(s *)0 是骗编译器说有一个指向类(或结构)s的指针,其地址值

 

&((s *)0)->m   是要取得类s中成员变量m的地址. 因基址为0,这时m的地址当然就是ms中的偏移

 

最后转换size_t 型,即unsignedint

 

有例子如: 

struct  

    int  i; 

    int  j; 

}; 

   

struct   A   *pA; 

pA = new   A; 

这时,pA实际上是一个Pointer,指向某一确定的内存地址, 0x1234; 

pA->i 整体是一个int型变量,其地址是&(pA->i),'&'为取址运算符; 

那么&(pA->i)一定等于0x1234, i 是结构体A的第一个元素。 

&(pA->j)一定是0x1234 +0x4 = 0x1238; 因为sizeof(int) = 4; 

   

这个做法的巧妙之处就是:它把“0”作为上例中的pA,那么&(pA->j)就是 j offset 

 

解析结果是: 

(s*)0, 0 强制转换为Pointer to "s"    

可以记 pS = (s*)0pS是指向s的指针,它的值是0; 

那么pS->m就是m这个元素了,而&(pS->m)就是m的地址,就是offset

 

linux内核 宏offsetof 解析

1offsetof(s,m)解析 offsetof(s,m)解析  2   3今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,定义如下:  4  5 #define ...

巧妙使用offsetof宏定义,在c,c++开发中解决问题

根据一个已经分配空间的结构体指针a中的某个成员b的地址,来获取该结构体指针地址...

结构体之offsetof宏详细解析

1、#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)     (include/linux/stddef.h) 1.1 ...

详解两个重要宏offsetof和containe…

本文解析关于结构体的两个重要宏offsetof( TYPE , MEMBER)和container_of(ptr , type , member) 实例1、#define offsetof( TYP...
  • marc07
  • marc07
  • 2017年03月17日 12:41
  • 105

Linux内核 container_of 宏和 offsetof 宏分析

1、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )宏功能:获得一个结构体变量成员在此结构体中的偏移量。1. ( (TY...

offsetof,搞嵌入式必须会的杀手锏

在嵌入式应用中,或许你对offsetof接触不多甚至根本没见过。如果是这样,那么从这一刻起就好好地掌握它,让它成为你的又一杀手锏吧。 1. offsetof与EEPROM   我们许多人可能都使用...

关于Linux/kernel.h中的offsetof和container_of宏

一、 位于Linux/kernel.h中 #define offsetof(s,m) (size_t)&(((s *)0)->m) #define container_of(ptr, type,...

linux内核细节- typeof、offsetof、container_of

container_of链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of。 container_of似乎就是为链表而生的,它的主要作用是根据一个...

offsetof 宏的简介

原文地址:http://baike.baidu.com/view/5513779.htm 定义   在stddef.h头文件中,该宏的完整说明如下:     #ifdef __cplusplus...

linux offsetof在用户态C语言实现及示例

若需转载,请注明出处 linux系统提供的offsetof方法是得到一个结构体中的一个成员字段的此结构体中的偏移字节,现在用户态进行实现。 在用户态进行实现的例子:得到一个结构体中...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Offsetof
举报原因:
原因补充:

(最多只允许输入30个字)