http://blog.csdn.net/mndscc/article/details/46803917
* 之前一直不理解((type *)0->member)是啥意思;甚至之前还在测试这种用法是否正确。
* 这次在看list_entry的时候,又发现了这个用法。
* 是在offsetof(type,member)中被调用的,
* 原宏为:
#define offsetof(type,member) ((size_t) &((type *)0)->member)
* size_t 是内核中的一种数据类型。是无符号的长整形。
* 这个宏的作用是,计算元素member在其所在结构提type中的偏移量。
* 那 看代码,还是不理解 。这不是在取member的地址么,还强制转化成size_t类型,
* 怎么就是他在里面的偏移量了呢?甚至,用0->取元素,这种用法对还是错呢?
* 哈哈,其实,重点就在用0->取元素上。
*
* 我们知道,定义结构体,内存会分配一块连续内存。结构体变量名也是该块连续内存的首地址。
* 平时取元素 ,也是利用偏移量来进行操作。
* 结构体内某一个元素的地址 = 结构体变量地址(即首地址)+ 偏移量。
* 所以,如果结构体变量地址 == 0;
* 该元素的地址 == 偏移量。
* 所以,利用这样的小技巧,通过从0(NULL)作为首地址取元素,
* 只要获取该元素的地址,就是该元素在其结构体内的偏移量了。
真的感叹c语言的巧妙,以及内核代码的构思,真真的灵活运用啊!
相关推荐
_syscall0 (int, fork) // 是unistd.h 中的内嵌宏代码。以嵌入汇编的形式调用 // Linux 的系统调用中断0x80。该中断是所有系统调用的 // 入口。该条语句实际上是int fork()创建进程系统调用。 // syscall0 名称...
Linux内核的实现博大精深,从offsetof的实现到后面的container_of,为什么通过结构体的的成员就能获得整个结构体的指针呢?这就得益于offsetof宏的实现。关于这个宏,前面的博文也有讲解,但不够深入,今天的这个...
引入以下宏: offset_of! 用于获取结构成员的偏移量。 offset_of_tuple! 用于获取元组成员的偏移量。 (需要Rust 1.20+) span_of! 用于获取一个或多个字段跨度的范围。 memoffset可在no_std环境下no_std 。 ...
结构体结构体定义、访问、传参,结构体对齐(offsetof宏、contaner_of宏),结构体内嵌函数指针,程序分层,模块化等。2. 共用体共用体与结构体的异同、共用体的作用、共用体举例3. 枚举第8章:自动类型转换、大小...
c语言结构体偏移 示例1 我们先来定义一下需求: 已知结构体类型定义如下: ...如果你对c语言的库函数比较熟悉的话,那么你第一个想到的肯定是offsetof函数(其实只是个宏而已,先姑且这样叫着吧),我们man 3 offset
对mongoose源码的分析,另外 分享了一些比较经典的用法,比如函数指针,strcspn实现,offsetof用法等等
结构体内存布局2.1 offsetof 定位某成员在结构体中的「 偏移量」2.2 为保证内存对齐,填充了什么值3. 内存对齐3.1 结构体成员默认内存对齐3.2 不同架构内存对齐方式3.3 小试牛刀3.3.1 前置填充3.3.2 中间填充3.3.3 ...
简介 本书由《C程序设计语言》的作者Kernighan和...27613.1 unsafe.Sizeof、Alig[0no0]f 和Offsetof 27613.2 unsafe.Pointer 27813.3 示例:深度相等 28013.4 使用cgo调用C代码 28213.5 关于安全的注意事项 286