container_of宏

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>

#define container_of(ptr, type, member) ({             /
         const typeof( ((type *)0)->member ) *__mptr = (ptr);     /
         (type *)( (char *)__mptr - offsetof(type,member) );})


struct test1
{
    char *pchar ;
    int idata ;
    int *pint ;
};

 

int main()
{
    struct test1 ptest1 ;
    int *p1 = ptest1.pint ;
    printf("the address of ptest1 is %p/n", &ptest1) ;
    printf("the address of p1 is %p/n", p1) ;
    ptest1.pint = 0x55555555 ;
    printf("offsetof(struct test1, pint)=%d/n", offsetof(struct test1, pint)) ;
    printf("container_of(p1, struct test1, pint) = %p/n", container_of(p1, struct test1, pint)) ;  //1
    printf("containerof(ptest1.pint, struct test1, pint)=%p/n", container_of(&ptest1.pint, struct test1, pint)) ;  //2

    printf("containerof(ptest1.pint, struct test1, pint)=%p/n", container_of(ptest1.pint, struct test1, pint)) ;    //3
    return 0 ;
}

 

container_of的作用在于,给定某结构体中字段的地址,能够获取该结构体的起始地址。比如上面的例子中示例2。

the address of ptest1 is 0xbfe5ce38
the address of p1 is 0xb7faeff4
offsetof(struct test1, pint)=8
container_of(p1, struct test1, pint) = 0xb7faefec      //p1的地址往前移8个字节
containerof(&ptest1.pint, struct test1, pint)=0xbfe5ce38    //使用&ptest1.pint作为第一个参数,获得ptest1的地址
containerof(ptest1.pint, struct test1, pint)=0x5555554d    //使用ptest1.pint做第一个参数,只是在该地址的基础上前移8个字节

-------&ptest1.pint是字段的地址,ptest1.pint是字段的值,该值是一个地址。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值