एक struct
के सदस्यों स्मृति में क्रमिक रूप से बाहर रखी हैं, संभवतः गद्दी के साथ, और struct का पता आम तौर पर पता है अपने पहले सदस्य का।
struct Bar {
int x;
int y;
};
struct Foo {
struct Bar b;
double d;
int i;
};
struct Foo f;
मान लें कि &f
0x10
में है। फिर, &f.b.x
(Foo
के पहले सदस्य का पहला सदस्य) 0x10
भी है। &f.b.y
0x14
है, क्योंकि f.b.x
चार बाइट्स (32-बिट मशीन मानते हुए) है। &f.d
0x18
है, और &f.i
0x20
है। पहला पता जो f
पर कब्जा नहीं किया गया है (दूसरे शब्दों में, &f + 1
) 0x24
है।
तो आपको यह सुनिश्चित करना है कि आपके पास संरचना के सदस्यों के लिए स्थान (ढेर या ढेर) स्थान है, और उचित डेटा के साथ स्थान भरें, और पहले सदस्य के पते को पास करें समारोह।
उदाहरण के लिए वास्तव में असेंबली शामिल है, तो आप आसानी से इसे एक छोटा परीक्षण कार्यक्रम लिखकर उत्पादित कर सकते हैं और gcc -S -O0 -g
के साथ संकलित कर सकते हैं, जो आपके सी कोड के लिए असेंबली कोड उत्पन्न करेगा।
int func(struct Foo * foo) {
return foo->b.x + foo->i;
}
int main() {
struct Foo foo;
foo.b.x = 42;
foo.b.y = 9;
foo.d = 3.14;
foo.i = 8;
func(&foo);
return 0;
}
विधानसभा उत्पादन में, आप अन्य बातों के अलावा, देखेंगे: उदाहरण के लिए (ध्यान दें: इस 64-बिट एएसएम है):
movl $42, -32(%rbp)
movl $9, -28(%rbp)
movabsq $4614253070214989087, %rax
movq %rax, -24(%rbp)
movl $8, -16(%rbp)
आप देख सकते हैं, मानों 42, 9, (पूर्णांक जिसका बिट पैटर्न 3.14 है), और 8 पते -32, -28, -24, और -16 (बेस पॉइंटर से संबंधित) में लोड किया जा रहा है। मेरे पास केवल एक सोलारिस बॉक्स आसान है, इसलिए मैं asmlinkage
का उपयोग नहीं कर सका (जो निर्दिष्ट करता है कि फ़ंक्शन तर्कों को रजिस्टरों की बजाय ढेर पर पारित किया जाना चाहिए), इसलिए फ़ंक्शन कॉल से ठीक पहले, हम संरचना का प्रभावी पता देखते हैं एक रजिस्टर में लोड किया जा रहा:
leaq -32(%rbp), %rax
movq %rax, %rdi
asmlinkage
इसके बजाय, आप देखना चाहते हैं इस प्रभावी पता ढेर पर धकेल दिया जा रहा है।
एल्डहुसेट, एक हैलो विश्व उदाहरण उपलब्ध है? –
मुझे लगता है कि सी 99 गारंटी देता है कि एक संरचना का पता अपने पहले सदस्य का पता है। –
@ टीसी .: उचित लगता है; मैंने "आम तौर पर" लिखा क्योंकि सिर्फ 100% यकीन नहीं था कि यह मामला था - लेकिन मुझे कोई कारण नहीं दिख रहा कि क्यों कोई संरचना की शुरुआत में पैडिंग जोड़ना चाहेगा। –