【学习笔记】【内核】container_of 的用法

根据结构体变量成员的指针获取整个结构体的指针

#include                                                                                                                                                                                              2 #include "stdlib.h"
#include "string.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) );})

struct person {
    char name[10];
    int age;
    int height;
    int weight;
};

void show_person(struct person *per)
{
    printf("name = %s\n", per->name);
    printf("age = %d\n", per->age);
    printf("height = %d\n", per->height);
    printf("weight = %d\n", per->weight);
}

int get_addr(char *name)
{
    struct person *per;

    printf("name = %p\n", name);
    per = container_of(name, struct person, name);
    printf("per = %p\n", per);
    show_person(per);
    return 0;
}

int main()
{
    struct person *per = NULL;

    per = (struct person*)malloc(sizeof(struct person));
    printf("per = %p\n", per);

    strcpy(per->name, "wang");
    per->age = 18;
    per->height = 168;
    per->weight = 120;

    printf("test\n");
    get_addr(per->name);
    return 0;
}

container_of 可以根据结构体成员的地址找到整个结构体的地址,但是前提是结构体的空间要是连续的

你可能感兴趣的:(学习,笔记)