2009-07-15 14 views
5

मेरे कार्यक्रम इस (main.c) की तरह है:Malloc, स्ट्रिंग संकेत दिए गए, और वेलग्रिंड

#include <stdlib.h> 
#include <stdio.h> 
void main(){ 
    char *first="hello "; 
    char *second="world!"; 
    char *seq=(char *)malloc((strlen(first)+1)*sizeof(char)); 
    strcat(strcpy(seq,first),second); 
    printf("%s\n",seq); 
    free(seq); 
} 

और मैं उपकरण valgrind साथ डिबग, यह कहा कि ($: valgrind --tool = Memcheck --leak की जांच = पूर्ण --track-मूल = हाँ ./main):

==5118== Memcheck, a memory error detector. 
==5118== Copyright (C) 2002-2008, and GNU GPL'd, by Julian Seward et al. 
==5118== Using LibVEX rev 1884, a library for dynamic binary translation. 
==5118== Copyright (C) 2004-2008, and GNU GPL'd, by OpenWorks LLP. 
==5118== Using valgrind-3.4.1, a dynamic binary instrumentation framework. 
==5118== Copyright (C) 2000-2008, and GNU GPL'd, by Julian Seward et al. 
==5118== For more details, rerun with: -v 
==5118== 
==5118== Invalid write of size 1 
==5118== at 0x402575B: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484EB: main (main.c:7) 
==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd 
==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484C3: main (main.c:6) 
==5118== 
==5118== Invalid write of size 1 
==5118== at 0x4025777: strcat (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484EB: main (main.c:7) 
==5118== Address 0x418a034 is 5 bytes after a block of size 7 alloc'd 
==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484C3: main (main.c:6) 
==5118== 
==5118== Invalid read of size 1 
==5118== at 0x4025963: strlen (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x40A0FA4: puts (in /lib/libc-2.10.1.so) 
==5118== by 0x80484F7: main (main.c:8) 
==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd 
==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484C3: main (main.c:6) 
==5118== 
==5118== Invalid read of size 1 
==5118== at 0x40ACEFE: _IO_default_xsputn (in /lib/libc-2.10.1.so) 
==5118== by 0x40AA3D0: [email protected]@GLIBC_2.1 (in /lib/libc-2.10.1.so) 
==5118== by 0x40A1020: puts (in /lib/libc-2.10.1.so) 
==5118== by 0x80484F7: main (main.c:8) 
==5118== Address 0x418a02f is 0 bytes after a block of size 7 alloc'd 
==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484C3: main (main.c:6) 
hello world! 
==5118== 
==5118== ERROR SUMMARY: 17 errors from 4 contexts (suppressed: 13 from 1) 
==5118== malloc/free: in use at exit: 7 bytes in 1 blocks. 
==5118== malloc/free: 1 allocs, 0 frees, 7 bytes allocated. 
==5118== For counts of detected errors, rerun with: -v 
==5118== searching for pointers to 1 not-freed blocks. 
==5118== checked 47,492 bytes. 
==5118== 
==5118== 
==5118== 7 bytes in 1 blocks are definitely lost in loss record 1 of 1 
==5118== at 0x402522D: malloc (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so) 
==5118== by 0x80484C3: main (main.c:6) 
==5118== 
==5118== LEAK SUMMARY: 
==5118== definitely lost: 7 bytes in 1 blocks. 
==5118==  possibly lost: 0 bytes in 0 blocks. 
==5118== still reachable: 0 bytes in 0 blocks. 
==5118==   suppressed: 0 bytes in 0 blocks. 

मुझे बता सकते हैं कौन क्यों और कैसे इसे ठीक करने के लिए।

उत्तर

17
char *seq=(char *)malloc((strlen(first)+1)*sizeof(char)); 

आप केवल 'पहले' के आकार की स्ट्रिंग के लिए स्मृति आवंटित कर रहे हैं।

strcat(strcpy(seq,first),second); 

और फिर आप इसमें पहले और दूसरे दोनों फिट करने का प्रयास करते हैं। यह कभी काम नहीं करेगा। strcat अधिक मेमोरी नहीं बनाता है, आपको malloc में शामिल करना होगा।

There is no need to cast the result of malloc in pure C.

यह भी आवश्यक नहीं sizeof(char) ऐसा करने के लिए, के रूप में है कि 1. कुछ प्रकार के मामले में यह बदलता है, कुछ इसे अव्यवस्था पर विचार के बारे में explict होने के लिए वैसे भी यह वहाँ लेना पसंद होने की गारंटी है।

+1

सी में 'malloc()' के वापसी मूल्य को डालने की कोई आवश्यकता नहीं है; भी, 'sizeof (char) 'हमेशा' 1' – Christoph

2

आप केवल पहले सीक में पर्याप्त स्थान आवंटित कर रहे हैं।

1

सीईसी केवल (स्ट्रेल (प्रथम) +1) * आकार (चार) लंबा है, पहले चरणबद्ध संगत स्ट्रिंग को पकड़ने के लिए पर्याप्त नहीं है।

-1

मुझे लगता है कि लाइन देख सकते हैं:

strcat (strcpy (सेक, पहले), दूसरे);

गलत तरीके से तैयार नहीं किया गया है। कारण यह है कि आप एक स्ट्रिंग कॉन्सटेनेशन कर रहे हैं, जहां आप उचित स्रोत नहीं दे रहे हैं। यदि आप उपर्युक्त वाक्यविन्यास को 2 लाइनों में घुमाते हैं तो यह ठीक काम करेगा।

strcpy (seq, first); स्ट्रैट (सीईसी, दूसरा);

ऐसा इसलिए है क्योंकि, जब आप स्ट्रिंग प्रतिलिपि कर रहे होते हैं, तो यह स्ट्रिंग को "पहले" से "seq" में कॉपी करेगा। अब, स्ट्रिंग कॉन्सटेनेशन के लिए, क्योंकि यह उचित स्रोत नहीं मिला [याद रखें कि आपने विशेष रूप से उल्लेख नहीं किया है कि स्रोत "seq" है], यह एक अवैध लेखन स्मृति रिसाव समस्या दे रहा है।

आशा है कि यह आपके प्रश्न को स्पष्ट करे। यदि कोई और जानकारी आवश्यक है, तो कृपया वापस लौटें।

+0

है, जैसा ऊपर बताया गया है, दूसरों द्वारा, आपको "सेकेंड" के लिए स्टोर करने के लिए, सीईसी के लिए उचित मेमोरी आवंटित करने की आवश्यकता है। –

+0

'strcpy() 'अपना पहला तर्क देता है, इसलिए' strcat (strcpy (seq, first), scond)' 'strcpy (seq, fiest) के बराबर है; स्ट्रैट (सीईसी, दूसरा); '। –

3

malloc() के लिए संबंधित free() कहां है?

+0

हाहा, मैंने इसे खो दिया, मैं सिर्फ strcpy और strcat की त्रुटि का प्रदर्शन करना चाहता हूँ। बेशक, मुझे मुफ्त (सीईसी) जोड़ना चाहिए; आप सब का धन्यवाद। –

+0

'मुख्य() 'रिटर्न – Christoph

+1

वाह के बाद ओएस द्वारा स्मृति को पूरी तरह से मुक्त किया गया है - मैं कभी भी' फ्री() 'को कॉल करने से परेशान क्यों करूं?:-) – Justicle

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