//计算结构体偏移量 #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"); }