Variable Length ArraysC99 से सी भाषा का हिस्सा रहा है। लेकिन उन्हें C11 में एक विशेषता के रूप में बनाया गया है - जिसका अर्थ है कि एक सी 11 अनुरूप कार्यान्वयन की आवश्यकता नहीं है (हालांकि, व्यावहारिक रूप से सभी कार्यान्वयन जो सी 99 का समर्थन करते हैं निश्चित रूप से सी 11 में वीएलए प्रदान करते हैं)।
आप जांच सकते हैं कि क्या आप कार्यान्वयन मैक्रो __STDC_NO_VLA__
(यदि इसे संकलन के सी 99 या सी 11 मोड में परिभाषित किया गया है) का उपयोग करके वीएलए प्रदान नहीं करता है, तो आपका कार्यान्वयन वीएलए का समर्थन नहीं करता है)।
तो रनटाइम पर एक सरणी आकार तय करने आधुनिक सी (> = C99) और कोड नीचे की तरह में संभव है ठीक है:
int s;
printf("Enter the array size: ");
scanf("%d", &s);
int a[s];
Vlas में से एक स्पष्ट दोष यह है कि s
काफी बड़ा है और अगर a
का आवंटन विफल हो गया। इससे भी बदतर, यह जांचने का कोई तरीका नहीं है कि आवंटन विफल हो गया है और आप रनटाइम त्रुटियों (उदा।, Segfault) में भाग लेंगे। यह अनिवार्य रूप से undefined behaviour है। तो यदि आप सरणी आकार बहुत बड़ा है तो आप वीएलए से बचना चाहते हैं। असल में, जब संदेह में, गतिशील स्मृति आवंटन के लिए जाएं (नीचे देखें)।
वीएलए के साथ अन्य की तुलना में बहुत कम गंभीर, यह है कि उनके पास स्वचालित संग्रहण अवधि (उर्फ "आवंटित स्टैक आवंटित") है। तो यदि आप ऐसा कुछ चाहते हैं जो लंबी अवधि तक रहता है तो ब्लॉक स्कोप जहां वीएलए घोषित किया गया है, तो वीएलए की कोई मदद नहीं है।
C89 में, कोई वीएलए नहीं है। तो गतिशील स्मृति आवंटन का उपयोग एकमात्र तरीका है। हालांकि, कुछ गैर-मानक एक्सटेंशन जैसे alloca()
थे जो वीएलए के समान हैं और वीएलए के समान ही दोष हैं)।
int s;
printf("enter the array size: ");
scanf("%d",&s);
int *a = malloc(s * sizeof *a);
...
free(a);
ओह मैं देखता हूं। धन्यवाद। तो सरणी के सभी तत्व अभी भी ढेर पर स्थित हैं? – root
हां, वे हैं। यदि यह बुरा है, तो अन्य उत्तरों में सुझाए गए अनुसार मॉलोक का उपयोग करें। –