• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C语言结构体中属性的偏移量计算

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
//计算结构体偏移量

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//详解:对于offscfof()函数,
//(TYPE *)0这句的意思是将内存地址是0内存块转换成一个TYPE类型的指针
//那么此时0地址的指针的步长就是TYPE,
//(TYPE *)0)->MEMBER这句话是取TYPE结构体的MEMBER属性(注意此时TYPE结构体的指针的值是0)
//&((TYPE *)0)->MEMBER,&就是取地址的运算符,这句话的意思是取TYPE结构体的MEMBER属性的地址
//(size_t)就是强转成size_t类型,因为此时结构体的指针的值是0,强转成Int型,恰巧就是MEMBER在结构体的偏移量
#define offscfof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

//详解:对于container_of()函数,
//offscfof(type,member)是该属性在结构体中的偏移量
//ptr是member属性在内存中的实际地址,为什么要将ptr强转成char *类型呢?
//这是由于指针加减的特殊性决定的 比如 (int *)ptr-1,指针会向上移动4个字节,(char *)ptr-1 指针会向上移动1个字节
//指针是有步长的,不能是简单的加减,偏移量就是偏移的字节数,所以强转成char *类型正好
#define container_of(ptr,type,member) (type *)((char *)ptr-offscfof(type,member))


typedef struct _student1{
    int num;
    char name[20];
    int pNext;
}Student1;

void main(){
    int res = 0;
    Student1 a;
    res = (int)container_of(&a.pNext,Student1, pNext);
    printf("Student1的地址%d\n", sizeof(a));
    printf("Student1的地址%x\n",&a);
    printf("Student1的地址%x\n", res);
    system("pause");
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
使用VisualC++6.0编译FLTK...发布时间:2022-07-14
下一篇:
C#学习笔记:泛型委托ActionT和FunTResult发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap