`
xiang37
  • 浏览: 414110 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

offsetof(TYPE, MEMBER)的宏定义

 
阅读更多

offsetof(TYPE, MEMBER)
该宏在Linux内核代码(版本2.6.22)中定义如下:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER);
 
分析:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了,size_t其实也就是int。
typedef __kernel_size_t  size_t;
typedef unsigned int __kernel_size_t;   
 
可见,该宏的作用就是求出MEMBER在TYPE中的偏移量。

转自:http://cutebunny.blog.51cto.com/301216/67517

分享到:
评论

相关推荐

    memoffset:Rust的offsetof

    引入以下宏: offset_of! 用于获取结构成员的偏移量。 offset_of_tuple! 用于获取元组成员的偏移量。 (需要Rust 1.20+) span_of! 用于获取一个或多个字段跨度的范围。 memoffset可在no_std环境下no_std 。 ...

    《C深度解析》第7、8章 结构体/共用体/枚举,杂项(自动类型转换、大小端序等)

    结构体结构体定义、访问、传参,结构体对齐(offsetof宏、contaner_of宏),结构体内嵌函数指针,程序分层,模块化等。2. 共用体共用体与结构体的异同、共用体的作用、共用体举例3. 枚举第8章:自动类型转换、大小...

    linux内核 0.11版本源码 带中文注释

    定义了NULL, offsetof(TYPE, MEMBER)。 #include <stdarg.h> // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个 // 类型(va_list)和三个宏(va_start, va_arg 和va_end),vsprintf、 // vprintf、...

    深度剖析C语言结构体

    这就得益于offsetof宏的实现。关于这个宏,前面的博文也有讲解,但不够深入,今天的这个例子,足以对结构体本身的原理大彻大悟,我们来看下面这个例子: #include //32位系统上,结构体在没指定对齐的时候,默认以...

    C语言中结构体偏移及结构体成员变量访问方式的问题讨论

    c语言结构体偏移 示例1 我们先来定义一下需求: 已知结构体类型定义如下: ...如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是offsetof函数(其实只是个宏而已,先姑且这样叫着吧),我们man 3 offset

    对mongoose源码的阅读,写的分享ppt,欢迎一起探讨

    对mongoose源码的分析,另外 分享了一些比较经典的用法,比如函数指针,strcspn实现,offsetof用法等等

    内存对齐(Memory alignment)

    结构体内存布局2.1 offsetof 定位某成员在结构体中的「 偏移量」2.2 为保证内存对齐,填充了什么值3. 内存对齐3.1 结构体成员默认内存对齐3.2 不同架构内存对齐方式3.3 小试牛刀3.3.1 前置填充3.3.2 中间填充3.3.3 ...

    Go程序设计语言

    简介 本书由《C程序设计语言》的作者Kernighan和...27613.1 unsafe.Sizeof、Alig[0no0]f 和Offsetof 27613.2 unsafe.Pointer 27813.3 示例:深度相等 28013.4 使用cgo调用C代码 28213.5 关于安全的注意事项 286

Global site tag (gtag.js) - Google Analytics