C語言結構體屬性的偏移量計算——關於offsetof函式的詳解
阿新 • • 發佈:2019-01-29
//計算結構體偏移量 #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"); }
轉載出處:http://www.cnblogs.com/zhanggaofeng/p/5567664.html