जवाबों:
आप शायद यहाँ केवल एक स्टैक ओवरफ़्लो प्राप्त कर रहे हैं। सरणी आपके प्रोग्राम के स्टैक एड्रेस स्पेस में फिट होने के लिए बहुत बड़ी है।
यदि आप ढेर पर सरणी आवंटित करते हैं तो आपको ठीक होना चाहिए, यह मानते हुए कि आपकी मशीन में पर्याप्त मेमोरी है।
int* array = new int[1000000];
लेकिन याद रखें कि इसके लिए आपको delete[]
सरणी की आवश्यकता होगी। एक बेहतर समाधान std::vector<int>
1000000 तत्वों का उपयोग करना और उनका आकार बदलना होगा।
सी या सी ++ में आमतौर पर स्थानीय वस्तुओं को स्टैक पर आवंटित किया जाता है। आप स्टैक पर एक बड़ी सरणी आवंटित कर रहे हैं, स्टैक से अधिक संभाल सकता है, इसलिए आपको स्टैकओवरफ़्लो मिल रहा है ।
इसे स्टैक पर स्थानीय आवंटित न करें, इसके बजाय किसी अन्य स्थान का उपयोग करें। यह या तो वस्तु को वैश्विक बनाकर या उसे वैश्विक ढेर पर आवंटित करके प्राप्त किया जा सकता है । यदि आप किसी अन्य संकलन इकाई से उपयोग नहीं करते हैं, तो वैश्विक चर ठीक हैं। यह सुनिश्चित करने के लिए कि दुर्घटना से ऐसा नहीं होता है, एक स्थिर भंडारण विनिर्देशक जोड़ें, अन्यथा बस हीप का उपयोग करें।
यह बीएसएस सेगमेंट में आवंटित करेगा, जो कि ढेर का एक हिस्सा है:
static int c[1000000];
int main()
{
cout << "done\n";
return 0;
}
यह DATA सेगमेंट में आवंटित करेगा, जो ढेर का एक हिस्सा है:
int c[1000000] = {};
int main()
{
cout << "done\n";
return 0;
}
यह ढेर में कुछ अनिर्दिष्ट स्थान पर आवंटित करेगा:
int main()
{
int* c = new int[1000000];
cout << "done\n";
return 0;
}
delete
आपके साथ आवंटित हर जगह के लिए अच्छा अभ्यास है new
। लेकिन अगर आपको यकीन है कि आप केवल एक बार (मुख्य रूप में) मेमोरी आवंटित करते हैं, तो इसकी कड़ाई से आवश्यकता नहीं है - मेमोरी को स्पष्ट के बिना भी मुख्य से बाहर निकलने पर मुक्त होने की गारंटी है delete
।
साथ ही, यदि आप अधिकांश UNIX और Linux सिस्टम में चल रहे हैं, तो आप निम्न कमांड द्वारा स्टैक का आकार अस्थायी रूप से बढ़ा सकते हैं:
ulimit -s unlimited
लेकिन सावधान रहें, स्मृति एक सीमित संसाधन है और बड़ी शक्ति के साथ महान जिम्मेदारियां आती हैं :)
आपको इस मामले में स्टैक पर आबंटित किया जा रहा है, आबंटन का उपयोग करके उसी आकार की एक सरणी आवंटित करने का प्रयास।