2017-01-04 9 views
18

क्या इन दो कोड लाइनों के मेमोरी उपयोग में कोई अंतर है?int x [10] कितनी मेमोरी आवंटित करता है?

int *a = malloc(10 * sizeof(int)); 
int b[10]; 

पहली पंक्ति 10 इंच और 1 सूचक के लिए स्मृति आवंटित करनी चाहिए। लेकिन मैं दूसरे के बारे में निश्चित नहीं हूँ। क्या वह 10 इंट्स और 1 पॉइंटर, या केवल 10 इट्स के लिए मेमोरी आवंटित करेगा?

उत्तर

21

सीधे शब्दों में कहें:

int *a = malloc(10 * sizeof(int)); 

आवंटित कम से कम sizeof(int*) स्वत: भंडारण के बाइट्स सूचक *a के लिए। जब malloc कहा जाता है, तो यह आपके प्रोग्राम के लिए गतिशील संग्रहण के कम से कम sizeof(int) * 10 बाइट आवंटित करेगा।

दूसरी ओर:

int b[10]; 

आवंटित कम से कम sizeof(int) * 10 स्वत: भंडारण के बाइट्स। यहां कोई संकेत नहीं है। जब आप अभिव्यक्ति में b नाम का उपयोग करते हैं (उदाहरण: a = b), यह एक सूचक में decays। लेकिन a एक सूचक है और b एक सरणी है। सी एफएक्यू पर यह जांचें: C-FAQ Sec. 6: arrays and pointers

सबसे सामान्य मामले में, "स्वचालित संग्रहण" का अर्थ है "ढेर", और "गतिशील भंडारण" का अर्थ "ढेर" है। लेकिन यह हमेशा सच नहीं है। आप इस प्रश्न में इस शब्द के बारे में कुछ चर्चाएं पढ़ना चाह सकते हैं: "Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?"

+7

यह कंपाइलर कैसे काम करता है इस पर निर्भर करता है कि यह पॉइंटर '* ए 'के लिए स्टैक में किसी भी स्मृति को आवंटित या नहीं कर सकता है। यदि आप कहीं भी '& a' का उपयोग करते हैं, हाँ, लेकिन अन्यथा सभी दांव बंद हैं। –

+0

धन्यवाद। मैं अपना जवाब दूंगा। – giusti

+1

@DietrichEpp फिर से पढ़ना, मैंने आपकी टिप्पणी को गलत समझा होगा। क्या आप मुझे एक ठोस उदाहरण दे सकते हैं? – giusti

8

पहले मामले में, a स्वचालित संग्रहण के sizeof(int *) बाइट्स पर कब्जा कर लेता है, और यह 10 * sizeof(int) डायनामिक स्टोरेज के बाइट्स पर इंगित करता है।

बाद के मामले में, b स्वचालित भंडारण के 10 * sizeof(int) बाइट्स पर कब्जा करता है। क्योंकि b एक सरणी है, कोई सूचक नहीं है।

तो पहला मामला अधिक बाइट्स का उपयोग करता है, लेकिन स्टैक पर कम (माना जाता है कि एक स्टैक स्वचालित संग्रहण के लिए उपयोग में है)।

यदि उपयोग किए जाने वाले बाइट्स की कुल संख्या अपेक्षाकृत छोटी है, तो स्वचालित संग्रहण आमतौर पर ठीक है। बड़ी मात्रा के लिए, गतिशील भंडारण को प्राथमिकता दी जाती है। विशेष रूप से ढेर कार्यान्वयन के लिए, बहुत अधिक स्वचालित चर होने के कारण बहुत अधिक बड़े पैमाने पर ढेर बह सकते हैं।

संबंधित मुद्दे