2007年4月6日 星期五

SUN公司的考試題目

據說是一道SUN公司的考試題目
題目如下:
寫出一個帶參數的巨集#define get_struct_addr_from_member_addr(p,stru,m)
這個巨集能根據任意的結構實體的某一個成員位址,算出該結構實體的位址
其中參數p是指向該成員的指標,stru結構實體,m是該成員名稱


本題答案:
#define get_struct_addr_from_member_addr(p, stru, m) \
(stru*)( (char*)p - (char*)&(((stru*)0)->m) )

這一題的答案,最怪的部份就是((stru*)0)->m了,居然有這種寫法@@
因為照理說根本不可能在位址為0的地方找到m的位址啊!

可是實際上是..編譯器在進行((stru*)0)->m的運算時,要先取得stru的位置才能取到m的位址,
而在m不存在時,位置就不會改變,於是結果就得到了stru的位置了@@
======================================================
//--winnt.h
// Calculate the address of the base of the structure given its type, and an
// address of a field within the structure.
//
#define CONTAINING_RECORD(address, type, field) ((type *)( \
(PCHAR)(address) - \
(UINT_PTR)(&((type *)0)->field)))

沒有留言: