यह struct
के किसी विशेष सदस्य के बाइट ऑफसेट को ढूंढ रहा है। उदाहरण के लिए, यदि आप निम्न संरचना था:
struct MyStruct
{
double d;
int i;
void *p;
};
तो फिर तुम offsetOf(MyStruct, d) == 0
, offsetOf(MyStruct, i) == 8
, और offsetOf(MyStruct, p) == 12
होगा (जो है, सदस्य d
नामित संरचना, आदि की शुरुआत से 0 बाइट्स की है)।
जिस तरह से यह काम करता है यह दिखाता है कि आपकी संरचना का एक उदाहरण पता 0 (((a*)(0))
भाग) पर मौजूद है, और फिर यह इच्छित संरचना सदस्य का पता लेता है और इसे पूर्णांक में रखता है। हालांकि पता 0 पर किसी ऑब्जेक्ट को डिफ्रेंस करना सामान्य रूप से एक त्रुटि होगी, तो पता लगाना ठीक है क्योंकि ऑपरेटर का पता &
और सदस्य dereference ->
एक-दूसरे को रद्द कर देता है।
यह आमतौर पर सामान्यीकृत क्रमबद्धता फ्रेमवर्क के लिए उपयोग किया जाता है। यदि आपके पास किसी प्रकार के वायर डेटा (जैसे फाइल में या नेटवर्क से बाइट्स) और इन-मेमोरी डेटा स्ट्रक्चर के बीच कनवर्ट करने के लिए कोड है, तो सदस्य नाम से सदस्य ऑफ़सेट में मैपिंग बनाना अक्सर सुविधाजनक होता है, ताकि आप क्रमबद्ध कर सकें या एक सामान्य तरीके से मूल्यों को deserialize।
स्रोत
2011-10-26 01:58:40
कि 'मैक्रो offsetof' सही नहीं है। उन्हें 'size_t' पर डाला जाना चाहिए, न कि 'int', और संभवतः उन्हें नल सूचकांक स्थिर होने के बावजूद परिणाम से' (char *) 0' घटा देना चाहिए। –