美文网首页
offsetof和container_of学习

offsetof和container_of学习

作者: 云端之上___ | 来源:发表于2019-03-13 11:06 被阅读0次
#include <stdlib.h>
#include <iostream>
// #include <stddef.h>
#define offsetof(TYPE,MEMBER)   ((size_t) &((TYPE *)0)->MEMBER)
#define container_of(PTR,TYPE,MEMBER)    ({  \
    const typeof(((TYPE *)0)->MEMBER) *__mptr=(PTR);  \
    (TYPE *) ((char *)__mptr - offsetof(TYPE,MEMBER)); })
using namespace std;
struct sNode{
    int a;
    int b;
    char c;
    sNode():a(1),b(2){}
    sNode(int a,int b):a(3),b(4){}
};

class cNode{
public:
    int a;
    int b;
    int d;
    cNode(int a,int b):a(a),b(b),c(11){}
private:
    int c;
    int f;
public:
    int p(){return 1;} 
    int e;
};

int main()
{
    sNode s;
    sNode s1(1,2);
    cNode c(1,2);
    cout << s.a << c.b << s1.a << endl;
    cout << offsetof(sNode, b) << endl;
    cout << offsetof(cNode, d) << endl;
    // cout << offsetof(cNode, c) << endl;//无法访问
    cout << offsetof(cNode, e) << endl;

    int *p = (int*)&c.a;
    cNode *ptt=container_of(p,cNode,a);//通过成员的地址来得到类或结构体的首地址
    cout << ptt->a << endl;
    char* pc =(char*) ptt;

    cout << (*((int*)(pc+12))) << endl;//输出了c的内容
    //cout << c.c << endl;//自然是错误的

    return 0;
}

//参考:https://www.cnblogs.com/litifeng/p/7690585.html

c++的类这么久自然说明上面的代码没啥意义,不过熟悉下整个流程还是好的

相关文章

  • offsetof和container_of学习

    c++的类这么久自然说明上面的代码没啥意义,不过熟悉下整个流程还是好的

  • C语言链表常用宏——offsetof和container_of

    链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of。 先看看代...

  • linux 内核 container_of() 宏函数 原理详解

    container_of() 宏函数源码: /** * container_of - cast a member ...

  • c++中 offsetof 宏定义解析

    c++中的offsetof可以求取结构体中某元素的相对偏移地址。 offsetof(TYPE, MEMBER)的宏...

  • sheepdog中object_cache.c文件C语言语法ti

    !!(x) :转换x为bool值,x为0则返回0,不为0则返回1。 offsetof宏使用offsetof宏需要包...

  • container_of

    (1)、作用:通过ptr(结构体某个成员的实际地址)计算的到相结构体的实际首地址(进而可以得到整个结构体)。 (2...

  • container_of

    功能 通过结构体成员变量的地址获取其结构体变量(container)的地址。 第一个参数 ptr 是成员的地址 第...

  • Linux 内核容器

    本文介绍Linux 4.4内核容器container_of()。 文件:include/linux/kernel....

  • C语言宏offsetof

    C 库宏 offsetof(type, member-designator) 会生成一个类型为 size_t 的整...

  • 宏 offsetof //./include/linux/stddef.h 众所周知,对内存地址为 0 进行解引用...

网友评论

      本文标题:offsetof和container_of学习

      本文链接:https://www.haomeiwen.com/subject/sylzpqtx.html