2012-10-13 24 views
15

मैं गारंटी देता हूं कि इस प्रश्न से पहले पूछा गया है, लेकिन मैं इसे खोज के माध्यम से नहीं ढूंढ पाया; किसी भी अनावश्यकता के लिए अग्रिम में खेद है।सी ऐरे इंस्टेंटेशन - स्टैक या हीप आवंटन?

यह मेरी (संभावित रूप से गलत) समझ है कि आप संकलन समय पर किसी ऑब्जेक्ट के आकार को जानते समय केवल स्टैक पर आवंटित करते हैं। एक सरणी आरंभ करने के मामले में तो, आप इनमें से किसी एक कर सकता है (और यह स्टैक पर जाना चाहिए):

char charArray[50]; 

के बाद से इस सरणी के आकार संकलन समय पर जाना जाता है, यह कोई मुद्दा नहीं होना चाहिए।

दूसरी ओर, इस (मेरा मानना ​​है कि) भी मान्य कोड है:

char anotherCharArray[someVariable + 50]; 

इस रूप में अच्छी तरह ढेर पर जाना चाहेंगे? मुझे यकीन है कि अगर आप इसे मुक्त करते हैं तो कोड segfaults() यह मुझे लगता है कि यह करता है, लेकिन यह वास्तव में मुझे समझ में नहीं आता है। इसी प्रकार, 100% एकमात्र ऐसी स्थिति है जहां आपको मॉलोक के माध्यम से आवंटित किया गया था जब आपको मुफ्त() का उपयोग करना होगा?

आपकी मदद के लिए अग्रिम धन्यवाद।

+2

@Shookit: आपको यह निर्दिष्ट करने की आवश्यकता है कि आप स्थानीय चर या ग्लोबल्स के बारे में बात कर रहे हैं या नहीं। –

+0

@PaulR यदि सरणी चर-लंबाई है, तो यह वैश्विक दायरे में नहीं हो सकती है। –

+1

आपको * स्वचालित स्टोरेज * और * स्टैक * के बीच अंतर करना है, जो डेटा स्टोर करने के लिए निम्न स्तर का तरीका है। स्वचालित भंडारण में रखा गया डेटा अन्य स्थानों पर भी रजिस्टरों की तरह रखा जा सकता है। एक अज्ञात आकार के साथ स्थानीय सरणी के मामले में (जिसे वीएलए: एस के रूप में जाना जाता है) संकलक इसे ढेर पर रख सकता है, इसे ढेर पर स्मृति आवंटित करने की भी अनुमति दी जाती है (जब तक इसे उचित स्थानों पर रिलीज़ किया जाता है)। वास्तव में, वीएलए: 'setjmp'/'longjmp' के साथ अच्छी तरह से नहीं जाते हैं क्योंकि वे रिसाव कर सकते हैं (और सी मानक द्वारा ऐसा करने की अनुमति है)। – Lindydancer

उत्तर

4

इसी प्रकार, 100% एकमात्र ऐसी स्थिति है जहां आपको मुफ्त() का उपयोग करना होगा जब डेटा malloc के माध्यम से आवंटित किया गया था?

हां। (कॉलोक और रीयलोक के अलावा, उनके रिटर्न वैल्यू free() 'डी भी हैं। इसी प्रकार, ऐसे मॉलोक() का उपयोग करने वाले फ़ंक्शन हैं और इस तथ्य को दस्तावेज किया गया है, उदाहरण के लिए strdup() - इन कार्यों का वापसी मूल्य भी मुक्त किया जा सकता है free(), जाहिर है।)

char anotherCharArray[someVariable + 50]; 

इस स्टैक पर के रूप में अच्छी तरह से जाना चाहेंगे?

हाँ, यह करता है (अधिकांश प्रयोगों में - निश्चित रूप से, यह नहीं हमेशा सच है कि आप मान, लेकिन प्लेटफार्मों के सबसे पर, यह है)। और हाँ यह वैध कोड है, लेकिन यह केवल सी 99 में मानक है।

+0

ठीक है, तो ऐसा लगता है कि मेरी सबसे बड़ी गलतफहमी यह मान रही थी कि स्टेक मेमोरी आवंटन के बाद संकलन समय पर आकार के ज्ञान की आवश्यकता होती है? मैंने इसे उत्तर के रूप में चिह्नित किया (लेकिन अभी भी मेरी टिप्पणी का जवाब देने में संकोच न करें :) – Shookit

+6

@Shookit हां, यह एक पूरी गलत धारणा है; ज्ञात आकार होने पर कुछ आवंटित किया जाता है, जहां अप्रासंगिक है। एकमात्र कनेक्शन यह है कि, सी के पिछले संस्करणों में, विभिन्न ऐतिहासिक कारणों से, 'ऑटो' चर के पास एक ज्ञात आकार होना था, और केवल 'ऑटो' चर को ढेर पर आवंटित किया जा सकता था। –

+0

@JimBalter ने आपके प्रश्न का बहुत जवाब दिया :) –

7

यदि char charArray[50]; फ़ाइल स्कोप (सभी कार्यों के बाहर) पर परिभाषित किया गया है या static है, तो यह स्टैक पर नहीं होगा, यह प्रोग्राम के स्टार्ट वेरिएबल पर वैश्विक रूप से प्रीलाकेट किया जा रहा है। यदि यह static नहीं है और फ़ंक्शन स्कोप पर परिभाषित किया गया है, तो यह स्टैक पर होगा।

char anotherCharArray[someVariable + 50]; केवल फ़ंक्शन स्कोप पर परिभाषित किया जा सकता है और यह ढेर पर होगा।

उपरोक्त सभी सी के सामान्य कार्यान्वयन पर लागू होते हैं। अटैचिकल लोग स्टैक के बजाय ढेर का उपयोग कर सकते हैं और प्रोग्राम के डेटा सेक्शन में प्रीलोकेटेड स्पेस के बजाय उपयोग कर सकते हैं।

आप free() नहीं हैं malloc(), calloc() या realloc() के साथ आवंटित नहीं किया गया है। सरल। कुछ फ़ंक्शन उपर्युक्त में से किसी एक का उपयोग कर सकते हैं, उदा। POSIX strdup()

+1

यदि हम वैश्विक दायरे में हैं, तो 'char someArray [variableLenght]; 'अनुमति नहीं है ... –

+0

@ H2CO3 क्या हालिया संपादन ने अस्पष्टता को हटा दिया? मैं नहीं देखता कि मैं कहां से संकेत दूंगा कि वैश्विक दायरे में इसकी अनुमति है। –