2011-09-09 120 views
0

我找到了計算結構偏移量的方法。如下:如何計算結構的偏移量

#define offsetOf(type , f) ((int)\ 
((char *)&((struct tagName*)0)->f-(char*)(struct tagName*)0)); 

,但我經常寫這樣的:

#define offsetOf(type , f) ((int)(&((struct tagName*)0)->f); 

書中說NULL指針的減法,以確保它是正確的,當內部NULL指針是非零。但我認爲NULL指針的內部不影響NULL指針的地址。

回答

3

標準庫應該提供一個完全符合您需要的offsetof,我強烈建議您使用它,因爲許多編譯器會針對自定義變體所需的代碼類型發出警告。

無論如何,減法會將您的代碼從指針域轉換到域size_t。我會說這樣更安全一些。

+0

謝謝,size_t更安全,但我只是想弄清楚NULL指針的減法,在書中說「495 c語言的問題」 – Samuel

3

爲什麼不使用stddef.h中定義的標準offsetof()宏?

+0

謝謝,但我只是想弄清楚NULL指針的減法,這樣做工作更安全 – Samuel

+0

@Samuel,使用標準的宏會說清楚。如果你想知道它是如何實現的以及它是如何工作的,那是另一回事。無論您的問題是計算偏移量還是理解offsetof()的特定實現,都不清楚您的問題。 – Kusalananda

+0

對不起我的泳池英語。其實我的問題是關於實施。再次感謝。 – Samuel

1

int絕對不能用於保存內存地址,請使用uintptr_t。或者只是使用offsetof而不是您自己的宏。

0永遠不會被定義爲0以外的東西,減法(char *)0是錯誤的。這本書是什麼建議的?當然你處理的地址只是虛擬地址,但你的程序永遠不會看到真實的地址。

該聲明可能對某些非常模糊的系統有意義,其中NULL不是0,並且您在宏中將0替換爲NULL。當然,如果這個系統存在,很容易理解爲什麼它不知道,可能是一個很大的失敗。