2013-05-21 10 views
15

किसी सरणी को स्मृति आवंटित करने के दो तरीके हैं, जिनमें से शुरुआत शुरुआत में अज्ञात है। सबसे आम तरीका यहmalloced सरणी वीएस। परिवर्तनीय-लंबाई-सरणी

int * array; 
... // when we know the size 
array = malloc(size*sizeof(int)); 

तरह malloc उपयोग कर रहा है लेकिन यह हम आकार का पता बाद सरणी परिभाषित करने के लिए C99 में भी मान्य है।

... // when we know the size 
int array[size]; 

वे बिल्कुल समान है?

+4

चूक गए दूसरे, यहां तक ​​कि C99 में, नहीं हमेशा वैध है। सी 99 §6.10.8.3 सशर्त फ़ीचर मैक्रोज़ के मुताबिक, एक कार्यान्वयन ** __ एसटीडीसी_NO_VLA __ ** और *** *** *** को परिभाषित नहीं कर सकता है, परिवर्तनीय लंबाई सरणी लागू करें, और * अभी भी मानक अनुपालन में हो। * – WhozCraig

+2

** यह एक नहीं है डुप्लिकेट प्रश्न **! संदर्भित प्रश्नों में से कोई भी मतभेदों पर ब्योरा नहीं देता है। – Jens

+2

@WozozCraig AFAIK, यह 2011 की बात है। मेरे पास ऐसा कोई अनुभाग नहीं है जो मेरे पास है जो सी 99 मानक की प्रतिलिपि बनता है। –

उत्तर

26

नहीं वे बिल्कुल बिल्कुल समान नहीं हैं। हालांकि ये दोनों ही करते हैं आप एक ही नंबर और वस्तुओं के प्रकार की दुकान, यह ध्यान रखें कि:

  • आप free() कर सकते हैं एक malloced सरणी, लेकिन आप कर सकते हैं नहीं free() एक चर लंबाई सरणी (हालांकि यह गुंजाइश और रहता है के बाहर चला जाता है एक बार संलग्न ब्लॉक छोड़ दिया गया है)। तकनीकी शब्दकोष में, उनके पास अलग-अलग संग्रहण अवधि: मैलोक बनाम स्वचालित परिवर्तनीय लंबाई सरणी के लिए आवंटित आवंटित है।
  • हालांकि सी एक ढेर की कोई अवधारणा नहीं है, कई कार्यान्वयन ढेर से एक चर लंबाई सरणी का आवंटन, जबकि mallocढेर से आवंटित करता है। यह स्टैक-सीमित सिस्टम पर एक मुद्दा है, उदा। कई एम्बेडेड ऑपरेटिंग सिस्टम, जहां स्टैक आकार केबी के क्रम पर है, जबकि ढेर बहुत बड़ा है।
  • एक परिवर्तनीय लंबाई सरणी के मुकाबले malloc के साथ असफल आवंटन के लिए परीक्षण करना भी आसान है।
  • malloced स्मृति realloc() के साथ आकार में बदला जा सकता है, जबकि वीएलए नहीं कर सकते हैं (अधिक सटीक केवल एक अलग सरणी आयाम के साथ ब्लॉक को निष्पादित करके - जो पिछली सामग्री खो देता है)।
  • होस्टेड C89 कार्यान्वयन केवल malloc() का समर्थन करता है।
  • एक होस्टेड सी 11 कार्यान्वयन परिवर्तनीय लंबाई सरणी का समर्थन नहीं कर सकता है (इसके बाद इसे __STDC_NO_VLA__ को पूर्णांक 1 के रूप में C11 6.10.8.3 के अनुसार परिभाषित करना होगा)।
  • बाकी सब कुछ मैं :-)
+2

संलग्न ब्लॉक के अंत में एक वीएलए गुंजाइश से बाहर हो जाता है (दिखाई देने के लिए बंद हो जाता है) क्योंकि इसमें ब्लॉक स्कोप है।यह ब्लॉक के अंत में मौजूद होना बंद कर देता है क्योंकि इसमें स्वचालित संग्रहण अवधि होती है। दो अलग-अलग चीजें –

+0

@ किथ थॉम्पसन शब्दावली संकेत के लिए धन्यवाद; मैंने जवाब को और सटीक बनाने के लिए संपादित किया है। – Jens

+2

@ किथ थॉम्पसन: सटीक होने के लिए, सरणी के लिए पहचानकर्ता संलग्न ब्लॉक के अंत में गुंजाइश से बाहर हो जाता है। स्कोप ऑब्जेक्टर्स (नाम) के गुण हैं, वस्तुओं की नहीं। एक वस्तु अपने पहचानकर्ता के दायरे से बाहर पहुंच योग्य हो सकती है, जब उसका पता किसी अन्य दिनचर्या में पारित किया जाता है। –

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