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

//计算结构体偏移量

#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
", sizeof(a));
    printf("Student1的地址%x
",&a);
    printf("Student1的地址%x
", res);
    system("pause");
}
原文地址:https://www.cnblogs.com/zhanggaofeng/p/5567664.html