php個人網(wǎng)站源碼2345網(wǎng)址導(dǎo)航怎么卸載
模擬實(shí)現(xiàn)offsetof
#define offsetof(StructType, MemberName) (size_t)&(((StructType *)0)->MemberName)
StructType是結(jié)構(gòu)體類型名,MemberName是成員名。具體操作方法是:
1、先將0轉(zhuǎn)換為一個結(jié)構(gòu)體類型的指針,相當(dāng)于某個結(jié)構(gòu)體的首地址是0。此時,每一個成員的偏移量就成了相對0的偏移量,這樣就不需要減去首地址了。
2、對該指針用->訪問其成員,并取出地址,由于結(jié)構(gòu)體起始地址為0,此時成員偏移量直接相當(dāng)于對0的偏移量,所以得到的值直接就是對首地址的偏移量。
3、取出該成員的地址,強(qiáng)轉(zhuǎn)成size_t并打印,就求出了這個偏移量。
代碼:
#include<stdio.h>
#include <stddef.h>
struct S {char c1;int i;char c2;
};
#define OFFSETOF(type,mem) (size_t)&(((type*)0)->mem) //將0轉(zhuǎn)化為結(jié)構(gòu)題指針(type*)0
int main() { //通過結(jié)構(gòu)體指針找到結(jié)構(gòu)體對象后取出其地址printf("%d\n", OFFSETOF(struct S, c1));printf("%d\n", OFFSETOF(struct S, i));printf("%d\n", OFFSETOF(struct S, c2));return 0;
}
結(jié)果: