2013-09-04 6 views
6

मैं एक कोड और प्रभावी बनाने के कोशिश कर रहा हूँ के रूप में ही है। मेरे पास ऐसा कुछ है:व्यवहार जब नया आकार पुराने

typedef struct{ 
    ... 
    }MAP; 



    MAP* pPtr=NULL; 
    MAP* pTemp=NULL; 
    int iCount=0; 
    while (!boolean){ 
    pTemp=(MAP*)realloc(pPtr,(iCount+1)*sizeof(MAP)); 
    if (pTemp==NULL){ 
    ... 
    } 
    pPtr=pTemp; 
    ... 
    iCount++; 
    } 

स्मृति गतिशील रूप से आवंटित की जा रही है। कोड को और अधिक कुशल बनाने के लिए मैं realloc कॉल को कम करना चाहता हूं। मैं जानना चाहता हूं कि नया आकार पुराने के बराबर है या नहीं। क्या कॉल को अनदेखा किया जाएगा?

+1

ओटी: मुझे लगता है कि '(iCount + 1) * sizeof (MAP)' कम से कम अच्छा दिखता है ... – alk

+0

@alk: आप सही हैं। इसे बदल देगा –

+0

अधिकांश कार्यान्वयनों शायद ही सूचक वापसी, लेकिन कुछ कभी कभी आबंटित स्थान स्थानांतरित करने के लिए भविष्य आवंटन आसान बनाने के लिए एक अवसर के रूप में एक ही आकार के साथ एक 'realloc' का उपयोग हो सकता है। –

उत्तर

8

यह मानक सी में निर्दिष्ट नहीं कर रहा है सभी मानक सी की गारंटी है : नए ऑब्जेक्ट की सामग्री पुराने और पुराने आकारों के कम से कम, डोलोकेशन से पहले पुरानी वस्तु के समान होगी।

हालांकि, अगर आप जीएनयू libc का उपयोग कर रहे हैं, यह स्पष्ट रूप कहते हैं एक ही पते पर लौटने के लिए, विस्तार के लिए here देखते हैं।

यदि आपके द्वारा निर्दिष्ट नया आकार पुराने आकार के समान है, realloc कुछ भी बदलने और आपके द्वारा दिए गए पते को वापस करने की गारंटी है।

+2

'realloc' जीएनयू' libc' द्वारा प्रदान किया गया है, जीसीसी द्वारा नहीं, जो कि केवल संकलक है। कई प्रणालियों पर, जीएनयू जीएनयू libc के अलावा पुस्तकालयों के साथ प्रयोग किया जाता है। –

+1

@ किथ थॉम्पसन फिक्स्ड, पॉइंटिंग के लिए धन्यवाद। –

3

यदि आकार बदलता नहीं है, तो मैं नो-ऑप के रूप में व्यवहार करने पर पुनर्विक्रय पर भरोसा नहीं करता (हालांकि ऐसा करने के लिए यह उचित बात है), लेकिन फिर आपको यह नहीं करना चाहिए: यदि मूल्य iCount नहीं बदला है, कॉल को फिर से शुरू करने के लिए मत बनाओ।

2

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

(btw, realloc से वापसी मान डाली कृपया नहीं है। यह आवश्यक नहीं है और यह अपरिभाषित व्यवहार छिपा सकते हैं अगर आप #include <stdlib.h> भूल जाते हैं।)

+0

मैं जाँच लगता है कि अगर realloc NULL भेजता है, महत्वपूर्ण है। जहां तक ​​मुझे पता है, आउटपुट शून्य होने पर, प्रत्येक एकल रीलॉक कॉल ऑनलाइन चेक उपलब्ध है। –

+0

@hhachem: फिर आवंटन आकार में परिवर्तन नहीं होने पर कॉल को छोड़ दें। –

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