मैं गारंटी देता हूं कि इस प्रश्न से पहले पूछा गया है, लेकिन मैं इसे खोज के माध्यम से नहीं ढूंढ पाया; किसी भी अनावश्यकता के लिए अग्रिम में खेद है।सी ऐरे इंस्टेंटेशन - स्टैक या हीप आवंटन?
यह मेरी (संभावित रूप से गलत) समझ है कि आप संकलन समय पर किसी ऑब्जेक्ट के आकार को जानते समय केवल स्टैक पर आवंटित करते हैं। एक सरणी आरंभ करने के मामले में तो, आप इनमें से किसी एक कर सकता है (और यह स्टैक पर जाना चाहिए):
char charArray[50];
के बाद से इस सरणी के आकार संकलन समय पर जाना जाता है, यह कोई मुद्दा नहीं होना चाहिए।
दूसरी ओर, इस (मेरा मानना है कि) भी मान्य कोड है:
char anotherCharArray[someVariable + 50];
इस रूप में अच्छी तरह ढेर पर जाना चाहेंगे? मुझे यकीन है कि अगर आप इसे मुक्त करते हैं तो कोड segfaults() यह मुझे लगता है कि यह करता है, लेकिन यह वास्तव में मुझे समझ में नहीं आता है। इसी प्रकार, 100% एकमात्र ऐसी स्थिति है जहां आपको मॉलोक के माध्यम से आवंटित किया गया था जब आपको मुफ्त() का उपयोग करना होगा?
आपकी मदद के लिए अग्रिम धन्यवाद।
@Shookit: आपको यह निर्दिष्ट करने की आवश्यकता है कि आप स्थानीय चर या ग्लोबल्स के बारे में बात कर रहे हैं या नहीं। –
@PaulR यदि सरणी चर-लंबाई है, तो यह वैश्विक दायरे में नहीं हो सकती है। –
आपको * स्वचालित स्टोरेज * और * स्टैक * के बीच अंतर करना है, जो डेटा स्टोर करने के लिए निम्न स्तर का तरीका है। स्वचालित भंडारण में रखा गया डेटा अन्य स्थानों पर भी रजिस्टरों की तरह रखा जा सकता है। एक अज्ञात आकार के साथ स्थानीय सरणी के मामले में (जिसे वीएलए: एस के रूप में जाना जाता है) संकलक इसे ढेर पर रख सकता है, इसे ढेर पर स्मृति आवंटित करने की भी अनुमति दी जाती है (जब तक इसे उचित स्थानों पर रिलीज़ किया जाता है)। वास्तव में, वीएलए: 'setjmp'/'longjmp' के साथ अच्छी तरह से नहीं जाते हैं क्योंकि वे रिसाव कर सकते हैं (और सी मानक द्वारा ऐसा करने की अनुमति है)। – Lindydancer