3 回答

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

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