2010-11-19 10 views
7

में स्मृति की कमी के कारण इस कोड को मुझे विभाजन दोष समय के बारे में 1/2 देता है:विभाजन गलती सी

int main(int argc, char **argv) { 
    float test[2619560]; 
    int i; 
    for(i = 0; i < 2619560; i++) 
     test[i] = 1.0f; 
} 

मैं वास्तव में एक बहुत बड़ा सरणी आवंटित करने के लिए की जरूरत है, वहाँ की अनुमति के किसी तरह से है ऑपरेटिंग सिस्टम मुझे और मेमोरी पाने की इजाजत देता है?

मैं लिनक्स Ubuntu 9.10

उत्तर

22

उपयोग कर रहा हूँ आप डिफ़ॉल्ट अधिकतम ढेर आकार, जो 8 MB है बह निकला रहे हैं।

आप या तो स्टैक आकार बढ़ा सकते हैं - उदाहरण के लिए। 32 MB के लिए:

ulimit -s 32767 

... या आप malloc साथ आवंटन करने के लिए स्विच कर सकते हैं:

float *test = malloc(2619560 * sizeof test[0]); 
+2

यदि आप मॉलोक का उपयोग करते हैं, तो आवंटन सफल होने पर आप कोड में चेक करने में सक्षम हैं - आवंटन के माध्यम से चलने से बेहतर और उम्मीद है कि यह क्रैश नहीं होता है। (परिशिष्ट, बहुत अधिक टिप्पणी नहीं @caf) –

+2

@ सैम डुफेल इस बात से अवगत रहें कि कुछ सिस्टम (जैसे डिफ़ॉल्ट रूप से लिनक्स) आपको स्मृति से बाहर होने पर भी मॉलोक से एक गैर-शून्य पॉइंटर वापस कर सकता है - जब भी आप दुर्घटनाग्रस्त हो जाते हैं आप उस स्मृति तक पहुंचने का प्रयास करते हैं। – nos

+0

यह कहने के लिए शायद अधिक सटीक है कि कुछ सिस्टम आभासी पता स्थान आवंटित करने और बैकिंग स्टोर करने की धारणाओं को अलग करते हैं। – caf

6

अभी आप का आवंटन कर रहे हैं (या कम से कम करने की कोशिश कर) स्टैक पर 2619560*sizeof(float) बाइट्स। कम से कम सामान्य मामलों में, ढेर केवल सीमित मात्रा में स्मृति का उपयोग कर सकते हैं। इसके बजाय आप यह static को परिभाषित करने की कोशिश कर सकते:

static float test[2619560]; 

यह ढेर के बाहर हो जाता है, तो यह आम तौर पर करने के बजाय किसी भी उपलब्ध स्मृति का उपयोग कर सकते हैं। अन्य कार्यों में, static के रूप में कुछ परिभाषित करना अर्थशास्त्र को बदलता है, लेकिन main के मामले में यह थोड़ा अंतर बनाता है (रिकर्सिव main की अधिकतर सैद्धांतिक संभावना के अलावा)।

+0

रिकर्सिव 'मुख्य', आह? दिलचस्प लगता है। – You

+0

@You: कभी-कभी आईओसीसीसी या कोड गोल्फ में उपयोग किया जाता है। अन्यथा, इतना नहीं (और सी ++ में अनुमति नहीं है)। –

0

यह स्टैक ओवरफ्लॉवर है। स्टैक आकार से बड़ी मेमोरी प्राप्त करने के लिए आप malloc फ़ंक्शन का उपयोग करना बेहतर करेंगे, जिसे आप इसे "ulimit -s" से प्राप्त कर सकते हैं।

1

स्टैक पर इतनी बड़ी वस्तु न डालें। इसके बजाय, इसे malloc() या उसके दोस्तों के साथ आवंटन द्वारा ढेर में संग्रहीत करने पर विचार करें।

2.6M फ्लोट्स बहुत से नहीं हैं, और 32-बिट सिस्टम पर भी आपको पता स्थान के लिए ठीक होना चाहिए।

यदि आपको एक बहुत बड़ी सरणी आवंटित करने की आवश्यकता है, तो 64-बिट सिस्टम का उपयोग करना सुनिश्चित करें (मान लें कि आपके पास पर्याप्त स्मृति है!)। 32-बिट सिस्टम केवल 3 जी प्रति प्रक्रिया को संबोधित कर सकते हैं, और फिर भी आप इसे एक ही संकुचित ब्लॉक के रूप में आवंटित नहीं कर सकते हैं।

संबंधित मुद्दे