2012-08-06 40 views
0

可能重複:
Why does this C code work?爲什麼不這段錯誤?

爲什麼沒有這個代碼查找場的一個結構給定段錯誤的偏移?

#define offset(structName,fieldName) (&((structName *)0)->fieldName) 
+4

滑稽,通常人們問,爲什麼他們的代碼_does_給段錯誤... – SingerOfTheFall 2012-08-06 09:26:21

+0

它可能;從技術上講,這是未定義的行爲。但是大多數編譯器會將其優化爲一個常數,所以在那些編譯器中,這可以用作offsetof()的實現。一般而言,offsetof()實現由編譯器決定; gcc確實使用__builtin_offsetof()。 – 2012-08-06 09:30:11

+0

關於offsetof的維基百科頁面給出了一些線索:http://en.wikipedia.org/wiki/Offsetof – 2012-08-06 09:31:02

回答

3

因爲它沒有訪問任何數據。這只是計算一個地址。 嘗試做這兩種操作:

foo = *offset(MyStruct, MyField); 
*offset(MyStruct, MyField) = 1234; 

,你會看到一個美麗的段錯誤:-)