喔滴剥壳
qiujinwu456
全部博文(37)
2010年(1)
2009年(19)
2008年(17)
dakklee
gaover
温柔像风
sky_emin
lgsd1234
lsq_008
manhaiju
ewyel
wisdonch
分类: C/C++
2009-11-19 15:18:50
#include<stdio.h> struct student{ char name[20]; char sex; }stu={"zhangsan",'m'}; int main() { struct student *stu_ptr; //存储container_of宏的返回值 int offset; //存储offsetof宏的返回值 //下面三行代码等同于 container_of(&stu.sex,struct student, sex )参数带入的情形 //const typeof(((struct student*)0)->sex) *_mptr = &stu.sex; const char *_mptr = &stu.sex; //首先定义一个 _mptr指针, 类型为struct student结构体中sex成员的类型 //typeof 为获取(((struct student*)0)->sex)的类型,此处此类型为char //((struct student*)0)在offsetof处讲解 offset = (int)(&((struct student *)0)->sex); /*((struct student*)0)为 把 0地址 强制转化为指向student结构体类型的指针 该指针从地址 0 开始的 21个字节用来存放name 与 sex(char name〔20〕与 char sex共21字节) sex存放在第20个字节出(从0字节开始) &((struct student *)0)->sex 取出sex地址(此处即为20) 并强制转化为整形 所以offset为20,后面的printf结果将证明这一点*/ stu_ptr = (struct student *)((char*)_mptr - offset); /*((char*)_mptr - offset)此处先把_mptr指针转化为字符形指针 (为什么这么做呢? 如果_mptr为整形指针 _mptr - offset 相当于减去 sizeof(int)*offset个字节) 减去 offset值 相当于 得到_mptr所在结构体的首地址(即stu的地址) 然后我们把 该地址 强制转化为 struct student类型即可正常使用了*/ printf("offsetof stu.sex = %d\n",offset); printf("stu_ptr->name:%s\tstu_ptr->sex:%c\n", stu_ptr->name, stu_ptr->sex); return 0; }
上一篇:chrome UI 学习笔记4--PathService
下一篇:c语言中长度为0的数组妙用[转]
登录 注册