2010-01-09 4 views
6

सी भाषा में, अपने सदस्य के पते से संरचना का प्रारंभ पता कैसे प्राप्त करें?अपने सदस्य के पते से संरचना का प्रारंभ पता कैसे प्राप्त करें

struct type1 { 
    //... 
    int member1; 
    //... 
}; 
struct type1 obj1; 

और ptr1obj1 में सदस्य member1 का पता, कैसे
मैक्रो #define start_add(ptr1, type1, member1) परिभाषित करने के लिए
आरंभ पता obj1 के प्राप्त करने के लिए है?

उत्तर

14

आप offsetof का उपयोग कर ऐसा कर सकते हैं:

#define start_add(ptr1, type1, member1) ((type1 *)((char *)(ptr1) - offsetof(type1, member1))) 
+2

मुझे लगता है कि आपके पास एक अतिरिक्त 'और' 'से पहले (ptr1)'। 'ptr1' पहले से ही सदस्य का पता है। –

+0

काफी सही, तय। –

+0

आपको पूरे मैक्रो परिणाम के आसपास ब्रैकेट का एक अतिरिक्त सेट भी जोड़ना चाहिए - याद रखें कि '->' '(प्रकार) 'की तुलना में अधिक प्राथमिकता है, इसलिए यदि आप परिणाम के लिए' -> 'लागू करना चाहते हैं तो आपको उनकी आवश्यकता होगी। – caf

1
खिड़कियों से

इस WDK

/* 
#define CONTAINING_RECORD(address, type, field) ((type *)(\ 
     (PCHAR)(address) - \ 
     (ULONG_PTR)(&((type *)0)->field))) 
*/ 
संबंधित मुद्दे