亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么此offsetof()實現有效?

為什么此offsetof()實現有效?

白衣非少年 2019-12-15 16:12:45
在ANSI C中,offsetof定義如下。#define offsetof(st, m) \    ((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))為什么由于我們取消引用NULL指針,這為什么不會引發分段錯誤?還是這種編譯器黑客看到了偏移量的唯一地址,因此它靜態地計算了地址而沒有實際取消引用呢?此代碼也可移植嗎?
查看完整描述

3 回答

?
慕尼黑8549860

TA貢獻1818條經驗 獲得超11個贊

上面的代碼中沒有任何內容被取消引用。當在地址值上使用*或->查找引用的值時,將發生取消引用。*上面的唯一用途是用于類型轉換的類型聲明。


在->操作上面使用,但它不是用來訪問值。相反,它用于獲取值的地址。這是一個非宏代碼示例,應使其更清晰一些


SomeType *pSomeType = GetTheValue();

int* pMember = &(pSomeType->SomeIntMember);

第二行實際上并不會導致取消引用(取決于實現)。它只是返回值SomeIntMember內的地址pSomeType。


您看到的是在任意類型和char指針之間進行了大量轉換。使用char的原因是,它是C89標準中唯一具有明確大小的類型之一(也許是唯一)。大小為1。通過確保大小為1,上述代碼可以達到計算值的真實偏移量的魔力。



查看完整回答
反對 回復 2019-12-16
?
素胚勾勒不出你

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))

那是某種編譯器錯誤,尤其是因為標頭是隨編譯器一起分發的,因此不起作用



查看完整回答
反對 回復 2019-12-16
  • 3 回答
  • 0 關注
  • 696 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號