3 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
上面的代碼中沒有任何內(nèi)容被取消引用。當(dāng)在地址值上使用*或->查找引用的值時(shí),將發(fā)生取消引用。*上面的唯一用途是用于類型轉(zhuǎn)換的類型聲明。
在->操作上面使用,但它不是用來訪問值。相反,它用于獲取值的地址。這是一個(gè)非宏代碼示例,應(yīng)使其更清晰一些
SomeType *pSomeType = GetTheValue();
int* pMember = &(pSomeType->SomeIntMember);
第二行實(shí)際上并不會(huì)導(dǎo)致取消引用(取決于實(shí)現(xiàn))。它只是返回值SomeIntMember內(nèi)的地址pSomeType。
您看到的是在任意類型和char指針之間進(jìn)行了大量轉(zhuǎn)換。使用char的原因是,它是C89標(biāo)準(zhǔn)中唯一具有明確大小的類型之一(也許是唯一)。大小為1。通過確保大小為1,上述代碼可以達(dá)到計(jì)算值的真實(shí)偏移量的魔力。

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
盡管這是的典型實(shí)現(xiàn)offsetof,但該標(biāo)準(zhǔn)并沒有強(qiáng)制要求該標(biāo)準(zhǔn):
在標(biāo)準(zhǔn)標(biāo)頭中定義了以下類型和宏<stddef.h>[...]
offsetof(type,member-designator)
它擴(kuò)展為一個(gè)整數(shù)常量表達(dá)式,其類型為size_t,member-designator從其結(jié)構(gòu)的開頭(由表示)到結(jié)構(gòu)成員(由表示)的偏移量(以字節(jié)為單位type)。類型和成員代號(hào)應(yīng)使
statictypet;
然后該表達(dá)式求值為一個(gè)地址常數(shù)。(如果指定的成員是位字段,則行為未定義。)&(t.member-designator)
閱讀PJ Plauger的“標(biāo)準(zhǔn)C庫”以獲取有關(guān)該庫以及其他<stddef.h>所有項(xiàng)目的討論,這些項(xiàng)目可能都是(應(yīng)該?)使用適當(dāng)?shù)恼Z言編寫的邊界功能,并且可能需要特殊的編譯器支持。
它僅具有歷史意義,但是我在386 / IX上使用了較早的ANSI C編譯器(請參閱,大約在1990年,我告訴過您歷史性的意義),該版本在該版本上崩潰了,offsetof但當(dāng)我將其修改為:
#define offsetof(st, m) ((size_t)((char *)&((st *)(1024))->m - (char *)1024))
那是某種編譯器錯(cuò)誤,尤其是因?yàn)闃?biāo)頭是隨編譯器一起分發(fā)的,因此不起作用
- 3 回答
- 0 關(guān)注
- 693 瀏覽
添加回答
舉報(bào)