1. 程式人生 > >C語言結構體屬性的偏移量計算——關於offsetof函式的詳解

C語言結構體屬性的偏移量計算——關於offsetof函式的詳解

//計算結構體偏移量

#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