निम्नलिखित संरचना पर विचार करें:
struct s {
int a, b;
};
आमतौर पर 1 , इस संरचना का आकार 8 और संरेखण 4 होगा।
क्या होगा अगर हम दो struct s
ऑब्जेक्ट बनाते हैं (अधिक सटीक रूप से, हम आवंटित दो ऐसी वस्तुओं में लिखते हैं), दूसरा ऑब्जेक्ट पहले ओवरलैपिंग के साथ?
char *storage = malloc(3 * sizeof(struct s));
struct s *o1 = (struct s *)storage; // offset 0
struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4
// now, o2 points half way into o1
*o1 = (struct s){1, 2};
*o2 = (struct s){3, 4};
printf("o2.a=%d\n", o2->a);
printf("o2.b=%d\n", o2->b);
printf("o1.a=%d\n", o1->a);
printf("o1.b=%d\n", o1->b);
क्या इस कार्यक्रम के बारे में कुछ भी अपरिभाषित व्यवहार नहीं है? यदि हां, तो यह अपरिभाषित कहां हो जाता है? यदि यह यूबी नहीं है, तो क्या यह हमेशा निम्नलिखित प्रिंट करने की गारंटी है:
o2.a=3
o2.b=4
o1.a=1
o1.b=3
विशेष रूप से, मुझे पता है कि क्या द्वारा वस्तु की ओर इशारा करने के लिए होता चाहते हैं o1
जब o2
, जो यह ओवरलैप करता है, लिखा है। यह अभी भी unclobbered हिस्सा (का उपयोग करने की अनुमति दी है o1->a
)? क्या क्लॉबर्ड वाले हिस्से o1->b
को एक्सेस करना बिल्कुल वैसा ही है o2->a
?
प्रभावी प्रकार यहां कैसे लागू होता है? जब आप अति-ओवरलैपिंग ऑब्जेक्ट्स और पॉइंटर्स के बारे में बात कर रहे हों तो नियम काफी स्पष्ट होते हैं जो आखिरी स्टोर के समान स्थान की ओर इशारा करते हैं, लेकिन जब आप वस्तुओं के प्रभावी प्रकार के हिस्सों या ओवरलैपिंग ऑब्जेक्ट्स के बारे में बात करना शुरू करते हैं तो यह कम स्पष्ट होता है।
दूसरा लेखन एक अलग प्रकार का होता तो क्या कुछ बदल जाता? यदि सदस्य कहते थे int
और short
दो के बजाय int
?
यदि आप इसके साथ खेलना चाहते हैं तो यहां एक गॉडबॉल है ।
1 यह उत्तर उन प्लेटफार्मों पर लागू होता है जहां यह स्थिति नहीं है: उदाहरण के लिए, कुछ का आकार 4 और संरेखण हो सकता है। 2. एक ऐसे मंच पर जहां आकार और संरेखण समान थे, यह प्रश्न संरेखित नहीं किया जाएगा क्योंकि वस्तुओं को ओवरलैप करना। असंभव है, लेकिन मुझे यकीन नहीं है कि अगर कोई ऐसा मंच है।