c - एक बड़ी सरणी घोषित करते समय एक स्टैक ओवरफ़्लो अपवाद प्राप्त करना




arrays memory (6)

निम्न कोड मेरे लिए एक स्टैक ओवरफ़्लो त्रुटि उत्पन्न कर रहा है

int main(int argc, char* argv[])
{
    int sieve[2000000];
    return 0;
}

मैं इसके आसपास कैसे पहुंचू? मैं टर्बो सी ++ का उपयोग कर रहा हूं लेकिन सी में अपना कोड रखना चाहता हूं

संपादित करें:

सलाह के लिए धन्यवाद। उपरोक्त कोड केवल उदाहरण के लिए था, मैं वास्तव में एक समारोह में सरणी घोषित करता हूं और उप मुख्य में नहीं। इसके अलावा, मुझे ज़ीरो में प्रारंभ करने के लिए सरणी की आवश्यकता थी, इसलिए जब मैंने मॉलोक को गुगल किया, तो मुझे पता चला कि कॉलोक मेरे उद्देश्यों के लिए बिल्कुल सही था।

मॉलोक / कॉलोक को एक वैरिएबल का उपयोग करके आकार घोषित करने की अनुमति देने के ढेर पर आवंटित करने का लाभ भी है।


3 तरीके हैं:

  1. ढेर पर सरणी आवंटित करें - अन्य पोस्टर्स के सुझाव के रूप में, malloc() उपयोग करें। free() इसे भूलना न भूलें (हालांकि main() यह महत्वपूर्ण नहीं है - ओएस प्रोग्राम समाप्ति पर आपके लिए स्मृति साफ़ करेगा)।
  2. इकाई स्तर पर सरणी घोषित करें - इसे डेटा सेगमेंट में आवंटित किया जाएगा और सभी के लिए दृश्यमान होगा (घोषणा static लिए static जोड़ना दृश्यता को इकाई तक सीमित करेगा)।
  3. अपनी सरणी को static रूप में घोषित करें - इस मामले में इसे डेटा सेगमेंट में आवंटित किया जाएगा, लेकिन केवल main() में दिखाई देगा।

आप ढेर पर आवंटित करने से बेहतर होगा, ढेर नहीं। कुछ इस तरह

int main(int argc, char* argv[])
{
    int * sieve;
    sieve = malloc(20000);
    return 0;
}

आपकी सरणी बहुत बड़ी है।

यह संभव है कि आपकी मशीन या ओएस में इतनी मेमोरी आवंटित न हो या नहीं।

यदि आपको बिल्कुल एक विशाल सरणी की आवश्यकता है, तो आप इसे गतिशील रूप से आवंटित करने का प्रयास कर सकते हैं ( malloc(...) का उपयोग करके), लेकिन फिर आपको स्मृति को लीक करने का खतरा है। स्मृति मुक्त करने के लिए मत भूलना।

मॉलोक का लाभ यह है कि यह ढेर के बजाय ढेर पर स्मृति आवंटित करने का प्रयास करता है (इसलिए आपको एक ढेर ओवरफ्लो नहीं मिलेगा)।

आप उस मान को देख सकते हैं जो मॉलोक यह देखने के लिए लौटाता है कि आवंटन सफल हुआ या विफल रहा। यदि यह विफल रहता है, तो बस एक छोटी सरणी को malloc करने का प्रयास करें।

एक और विकल्प एक अलग डेटा संरचना का उपयोग करना होगा जिसे फ्लाई पर आकार दिया जा सकता है (एक लिंक्ड सूची की तरह)। Wether यह विकल्प अच्छा है इस बात पर निर्भर करता है कि आप डेटा के साथ क्या करने जा रहे हैं।

फिर भी एक और विकल्प एक फाइल में चीजों को स्टोर करना होगा, फ्लाई पर डेटा स्ट्रीम करना होगा। यह दृष्टिकोण सबसे धीमा है।

यदि आप हार्ड ड्राइव पर स्टोरेज के लिए जाते हैं, तो आप मौजूदा पुस्तकालय (डेटाबेस के लिए) का भी उपयोग कर सकते हैं


इसके बजाय malloc प्रयोग करें। वाक्य - विन्यास:

newnode=(struct node *)malloc(sizeof(struct node))

टर्बो सी / सी ++ के रूप में 16 बिट कंपाइलर int डेटाटाइप लगभग 2 बाइट खपत करता है। 2bytes * 2000000 = 40,00,000 बाइट्स = 3.8147 एमबी स्पेस।

फ़ंक्शन के ऑटो चर ढेर में संग्रहीत होते हैं और इससे स्टैक मेमोरी का ओवरफ़्लो होता है। इसके बजाय प्रोसेसर मेमोरी मैपिंग की उपलब्धता के अनुसार आवश्यक मेमोरी बनाने के लिए डेटा मेमोरी [स्थिर या ग्लोबल वैरिएबल का उपयोग करके] या गतिशील ढेर मेमोरी [मॉलोक / कॉलोक का उपयोग करके] का उपयोग करें।


मॉलोक का प्रयोग करें। सभी जांचें कि वापसी का प्रकार शून्य नहीं है, अगर यह शून्य है तो आपके सिस्टम में बस कई मानों को फिट करने के लिए स्मृति की आवश्यकता नहीं है।





allocation