2012-02-24 11 views
5

के आकार पढ़ा है, मुझे यकीन है कि इसकी मुझे char *url pointer कोस के साथ कुछ मिला हूँ ...वेलग्रिंड अमान्य मुझे के जीवन मैं बाहर काम नहीं कर सकते कारण है कि मैं इस कोड स्निपेट के लिए एक <code>invalid read size of 1</code> हो रही है के लिए 1

char *extractURL(char request[]) 
{ 
char *space = malloc(sizeof(char *)); 
space = strchr(request, ' ')+1; 
char *hostend = malloc(sizeof(char *)); 
hostend = strchr(request, '\r'); 
int length = hostend - space; 
if (length > 0) 
{ 
    printf("Mallocing %d bytes for url\n.", length+1); 
    char *url = (char *)malloc((length+1)*sizeof(char)); 
    url = '\0'; 
    strncat(url, space, length); 
    return url; 
} 
//else we have hit an error so return NULL 
return NULL;  
} 

valgrind त्रुटि मैं हो रही है:

==4156== Invalid read of size 1 

==4156== at 0x4007518: strncat (mc_replace_strmem.c:206) 

==4156== by 0x8048D25: extractURL() 

==4156== by 0x8048E59: processRequest() 

==4156== by 0x8049881: main() 

==4156== Address 0x0 is not stack'd, malloc'd or (recently) free'd 

कर सकते हैं किसी को सही दिशा में 'बिंदु' मुझे?

+0

आप यूआरएल के लिए स्मृति आवंटित करते हैं, फिर इसे एक शून्य सूचक पर सेट करें। (url = '\ 0';) क्या आपका मतलब है, शायद, url [0] = '\ 0' सेट करने के लिए; ? – Joe

+0

क्या आप शायद strncpy का उपयोग करना चाहते हैं? – Cascabel

+0

आपके पास अपने पहले दो 'मॉलोक' कॉल के साथ मेमोरी लीक भी है, जिस तरह से वे स्वयं पूरी तरह से फर्जी हैं, आप 'char' * सूचक * के आकार को' आकार 'क्यों आरक्षित करेंगे? आपका तीसरा 'मॉलोक 'संभावित भ्रम के संकेत भी दिखाता है: (1)' मॉलोक 'की वापसी कास्ट न करें, यह केवल परिभाषाओं के अनुसार बग (2)' आकार (चार)' '1' छुपाता है, जो संख्या आप पास करते हैं 'malloc'' की संख्या 'char' है जिसे आप आवंटित करना चाहते हैं। –

उत्तर

8

यहाँ

char *url = malloc((length+1)*sizeof(char)); 
url = '\0'; 
strncat(url, space, length); 

आप तुरंत malloced स्मृति NULL करने के लिए url की स्थापना करके खो देते हैं। ध्यान दें कि '\0' 0 है, जो एक शून्य सूचकांक स्थिर है। और फिर आप अमान्य स्मृति स्थान पर strncat कुछ करने का प्रयास करें।

आप शायद वहाँ

*url = '\0'; 

सेट करने के लिए होती।

+0

तब यह एक अनियमित मूल्य पर एक सशर्त कूद कर strncat की ओर जाता है हालांकि यह नहीं करता है? – DMcB1888

+0

ठीक है, मैं वास्तव में 'strncat (NULL, कुछ, n)' कॉल करते समय एक segfault की अपेक्षा करता हूं, लेकिन अगर यह पसंद करता है तो वाल्ग्रिंड रिपोर्ट कर सकता है। –

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

  • कोई संबंधित समस्या नहीं^_^