//計算結構體偏移量 #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\n", sizeof(a)); printf("Student1的地址%x\n",&a); printf("Student1的地址%x\n", res); system("pause"); }