2011-02-02 10 views
5

मैंने इसे खोजने के लिए निम्न कोड का उपयोग किया लेकिन मुझे हमेशा जवाब के रूप में 1 मिलता है। क्या वहाँ कुछ गड़बड़ है। धन्यवादआपके प्रोग्राम के लिए आवंटित कितने जीबी malloc

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 
    int mult = 0; 
    int chk =8; 
    do{ 
     mult+=1; 
     int *p = (int*)malloc(1024*1024*1024*mult); 
     if(p==0){ 
      chk =0; 

     }else{ 
      free(p); 
     } 
    }while(chk !=0); 
    mult = mult -1; 
    printf("The number of gigs allocated is : %d\n",mult); 
    return 0; 
} 

बस मदद करने के लिए, मेरे पास 64 बिट सिस्टम दोनों विंडोज़ और लिनक्स स्थापित हैं। इस प्रकार, उपरोक्त तर्क सही है भले ही मुझे 64 बिट सिस्टम पर उत्तर के रूप में केवल 1 जीबी मिल रहा है?

+0

यह अपने ओ/s पर निर्भर करता है। यह ओ/एस द्वारा निर्धारित सीमाओं पर निर्भर हो सकता है, जिसे उचित विशेषाधिकार प्राप्त उपयोगकर्ताओं द्वारा समायोजित किया जा सकता है। क्या आपने 1023 * 1024 * 1024 * 2 आवंटित करने का प्रयास किया है? –

+4

मुझे लगता है कि यह कोड पूर्णांक ओवरफ्लो से पीड़ित है, यदि int एक हस्ताक्षरित 32-बिट चर है। स्थिरांक को लंबे समय तक हस्ताक्षर करने का प्रयास करें (या आपके कंपाइलर के पास लंबे समय तक हस्ताक्षर किए गए हैं)। – unwind

+0

@unwind यह मेरे लिए काम किया। मैं इसे बंद करने से पहले पिछले 500 जीबी प्राप्त करने में सक्षम था। (मैक ओएस एक्स एक निश्चित आकार से 'mmap()' का उपयोग करता है।) अपनी टिप्पणी को एक उत्तर दें ताकि मैं इसे वोट दे सकूं। – chrisaycock

उत्तर

3

यदि यह 32-बिट ओएस है, तो यह आश्चर्य की बात नहीं है कि सबसे बड़ा संगत ब्लॉक 1 जीबी (या उस और 2 जीबी के बीच कहीं) होगा। 64-बिट ओएस पर, बड़े ब्लॉक संभव होंगे।

यदि आप छोटे व्यक्तिगत टुकड़ों को आवंटित करने के लिए अपना कोड बदलते हैं, तो आप संभवतः 1 जीबी से अधिक आवंटित करने में सक्षम होंगे।

+1

कभी-कभी, आप 32-बिट सिस्टम पर लगभग 3, 3.5 जीबी तक पहुंच सकते हैं। निश्चित रूप से 4 जीबी हार्ड सीमा है। यह * * से कुछ मूल्य छोटा है। –

+0

@ जोनाथन: मैं अपने जवाब में संख्याओं का उल्लेख करने जा रहा था और फिर इसके बारे में बेहतर विचार किया क्योंकि मुझे नहीं पता था कि वह किस प्लेटफ़ॉर्म का उपयोग कर रहा था। इसके अलावा विचार करने के लिए विखंडन जैसे अन्य मुद्दे भी हैं। एक लूप में 1 एमबी ब्लॉक आवंटित करने से अधिकतम वास्तविक दुनिया अनुप्रयोगों (कम से कम मेरे अनुभव में) की तुलना में अधिकतम "ओवरस्टेट" होगा। –

+0

@ जोनाथन: यदि 32-बिट ओएस आपको 2 जीबी से अधिक संगत आवंटित करने की अनुमति देता है और अभी तक 32-बिट 'ptrdiff_t' है, तो यह ** टूटा ** और ** गैर-अनुरूप ** है (यह गलत संकेत देगा सूचक मतभेद, जो बेहद खतरनाक हो सकता है!)। –

1
int main(void){ 
    int MB = 0; 
    while(malloc(1<<30)){ 
     ++MB; 
    } 
    printf("The number of gigs allocated is : %d\n",MB); 
    return EXIT_SUCCESS; 
} 
+1

यह दिखाने के लिए क्या माना जाता है? आप आसानी से ऐसी परिस्थिति में आ सकते हैं जहां मॉलोक बिना त्रुटि के वापस आ सकता है लेकिन वास्तव में आपके पास अधिक जगह आवंटित करता है। "स्मृति ओवरकमिट" पर एक नज़र डालें – Falmarri