0
爲什麼沒有這個代碼查找場的一個結構給定段錯誤的偏移?
#define offset(structName,fieldName) (&((structName *)0)->fieldName)
爲什麼沒有這個代碼查找場的一個結構給定段錯誤的偏移?
#define offset(structName,fieldName) (&((structName *)0)->fieldName)
因爲它沒有訪問任何數據。這只是計算一個地址。 嘗試做這兩種操作:
foo = *offset(MyStruct, MyField);
*offset(MyStruct, MyField) = 1234;
,你會看到一個美麗的段錯誤:-)
滑稽,通常人們問,爲什麼他們的代碼_does_給段錯誤... – SingerOfTheFall 2012-08-06 09:26:21
它可能;從技術上講,這是未定義的行爲。但是大多數編譯器會將其優化爲一個常數,所以在那些編譯器中,這可以用作offsetof()的實現。一般而言,offsetof()實現由編譯器決定; gcc確實使用__builtin_offsetof()。 – 2012-08-06 09:30:11
關於offsetof的維基百科頁面給出了一些線索:http://en.wikipedia.org/wiki/Offsetof – 2012-08-06 09:31:02