सी

2011-11-29 8 views
5

में रीयलोक का उपयोग करना रीयलोक के उपयोग के संदर्भ में कुछ सलाह के लिए वास्तव में एक पोस्ट है, अधिक विशेष रूप से, यदि मैं अपने मौजूदा कोड को सरल बनाने के लिए इसका उपयोग कर सकता हूं। अनिवार्य रूप से, नीचे क्या होता है, यह गतिशील रूप से कुछ स्मृति आवंटित करता है, अगर मैं 256 से अधिक हो जाता हूं, तो सरणी को आकार में बढ़ाया जाना चाहिए, इसलिए मैं एक एक्सपी आकार, memcpy इत्यादि के साथ एक temp सरणी malloc (नीचे देखें)।सी

मैं बस सोच रहा था कि अगर नीचे दिए गए कोड में रीयलोक का उपयोग किया जा सकता है, इसे सरल बनाने के लिए, कोई सलाह, नमूना कोड, या यहां तक ​​कि संकेतों को लागू करने के संकेतों की बहुत सराहना की जा रही है!

चीयर्स।

void reverse(char *s) { 
char p; 

switch(toupper(s[0])) 
{ 
    case 'A': case 'E': case 'I': case 'O': case 'U': 
     p = s[strlen(s)-1]; 
     while(p >= s) 
      putchar(p--); 
     putchar('\n'); 
     break; 
    default: 
     printf("%s", s); 
     break; 
} 
printf("\n"); 
    } 

    int main(void) { 
char c; 
int buffer_size = 256; 
char *buffer, *temp; 
int i=0; 

buffer = (char*)malloc(buffer_size); 
while (c=getchar(), c!=' ' && c!='\n' && c !='\t') 
{ 
    buffer[i++] = c; 
    if (i >= buffer_size) 
    { 
     temp = (char*)malloc(buffer_size*2); 
     memcpy(temp, buffer, buffer_size); 
     free(buffer); 
     buffer_size *= 2; 
     buffer = temp; 
    } 
} 
buffer[i] = '\0'; 
reverse(buffer); 

return 0; 

}

+1

शैली का एक नोट: आपको 'malloc' के वापसी मूल्य को कास्ट करने के लिए ** ** ** पसंद करना चाहिए। –

+1

और 'रिवर्स' को तर्क 'कॉन्स्ट char *' के रूप में लेना चाहिए। –

उत्तर

11

हाँ संक्षिप्त उत्तर है। यहाँ यह कैसा दिखेगा है:

if (i >= buffer_size) 
{ 
    temp = realloc(buffer, buffer_size*2); 
    if (!temp) 
     reportError(); 
    buffer_size *= 2; 
    buffer = temp; 
} 

ध्यान दें कि आप अभी भी एक अस्थायी सूचक का उपयोग करने के realloc() का परिणाम पकड़ करने के लिए की जरूरत है; यदि आवंटन विफल रहता है तो आपके पास अभी भी वैध buffer पॉइंटर अभी भी मान्य-मौजूदा मौजूदा बफर के लिए है।

1

realloc काफी आप के लिए क्या चाहिए, तो है - आप की तरह कुछ के साथ if (i >= buffer_size) अंदर कि पूरे ब्लॉक की जगह ले सकता:

buffer = (char*)realloc(buffer, buffer_size*2); 
buffer_size *= 2; 

सूचना इस त्रुटि पर ध्यान नहीं देता है कि स्थिति (यदि realloc से वापसी NULL है); इस स्थिति को पकड़ना पाठक को छोड़ दिया गया है।

1

हां, realloc का उपयोग आपके कोड को थोड़ा सरल बनाने के लिए किया जा सकता है। आप, त्रुटि हैंडलिंग में कोई दिलचस्पी नहीं कर रहे हैं तो यह:

char *tmp = malloc(size*2); 
memcpy(temp, buffer, size); 
free(buffer); 
buffer = tmp; 

अनिवार्य रूप से इस के बराबर है:

buffer = realloc(buffer, size*2); 

आप त्रुटि से निपटने में रुचि रखते हैं (और आप शायद होना चाहिए), तो तो आपको NULL वापसी मानों की जांच करनी होगी। यह आपके मूल कोड के बारे में भी सच है।

+1

-1। यदि रीलॉक विफल हो जाता है (NULL लौटकर), तो आपने मूल ब्लॉक का संदर्भ खो दिया है। –

+1

@ ग्राहम: मैंने स्पष्ट रूप से कहा "अगर आपको त्रुटि-प्रबंधन में रूचि नहीं है"। ओपी में उनके मूल कोड में कोई त्रुटि-प्रबंधन नहीं है, या तो। –

+1

यह "त्रुटि प्रबंधन" सिर्फ कुछ बच्चे के नाटक की तरह नहीं है जैसे 'std :: cin >> n'; यह यहां यूबी लगभग निश्चित रूप से कारण बन सकता है और ... निश्चित रूप से –

1

हाँ, अपने कोड को आसान बनाने के लिए, आप की जगह ले सकता

if (i >= buffer_size) 
{ 
    temp = (char*)malloc(buffer_size*2); 
    memcpy(temp, buffer, buffer_size); 
    free(buffer); 
    buffer_size *= 2; 
    buffer = temp; 
} 
साथ

if (i >= buffer_size) 
    buffer = realloc(buffer, buffer_size *= 2); 

यह खाता त्रुटि जाँच पर ध्यान नहीं देता है ताकि आप करने के लिए जाँच करने की आवश्यकता होगी

यकीन realloc नहीं करता ' टी NULL वापस।

+1

'realloc' वापस 'वापस' लौटा सकता है, जिससे आपको तत्काल अप्राप्य रिसाव मिलती है। –

+2

-1।यदि रीलॉक विफल हो जाता है (NULL लौटकर), तो आपने मूल ब्लॉक का संदर्भ खो दिया है। –

+2

@ ग्राहमबोरलैंड मैंने कहा कि आप उस कोड के साथ अपने मूल कोड को प्रतिस्थापित कर सकते हैं। उन्होंने वहां 'नूल' की जांच नहीं की, इसलिए न तो मैंने किया। लेकिन मैंने इसका उल्लेख करने के लिए एक नोट जोड़ा। –