2012-12-28 16 views
10

मैं valgrind साथ समस्या हो रही है: यह मेरा कार्यक्रम (अच्छी तरह से मुख्य हिस्सा है जहां त्रुटियों दिखाई देते हैं) है:वेलग्रिंड: आकार का अमान्य पढ़ने 1

int main() 
{ 
char comanda[N]; 
.... 
char *p; 
while(fgets(comanda,100,stdin)!=NULL) 
    { 
    p=strtok(comanda," \n"); 
    if (strcmp(comanda,"INIT")==0) 
     { 
     p=strtok(NULL," "); 
     Init(n);   
     } 
395 >>if (strcmp(p,"DUMP")==0) 
     { 
     Dump(n);} 
    if (strcmp(p,"ALLOC")==0) 
     { 
     Alloc(j,n); 
     } 
    ....return 0;} 

और यह कहते हैं जब मैं चलाने valgrind:

Invalid read of size 1 
at 0x401569: main (:395) 
Address 0x0 is not stack'd malloc'd or (recently) free'd 

मैं समझ नहीं इस कार्यक्रम के साथ क्या बात है।

+2

जांचें कि 'स्ट्र' के बाद 'पी'' NULL' है या नहीं। – DCoder

+0

यह निर्धारित करने के लिए कि वे क्या गलत कर रहे हैं, डीबगर के तहत प्रोग्राम चलाने के लिए भी एक अच्छा विचार हो सकता है। –

+2

यहां एक डीबगर की आवश्यकता नहीं है, वाल्ग्रिंड बिल्कुल कहता है कि यहां क्या हो रहा है। @ user1934103, कृपया यह बताएं कि यह आपको क्या बता रहा है। यह संकेत उस स्थान पर '0x0' क्या हो सकता है? तो यह आपको बता रहा है कि 'पी'' 0' है। –

उत्तर

5

strtok के लिए यह संभव है जब कोई टोकन शेष न हो तो NULL लौटाएं।

जब आप strcmp पर न्यूल पास करते हैं तो यह एक अपरिभाषित व्यवहार है क्योंकि आप वहां पर संदर्भित करते हैं।

22

यह कैसे पढ़ने के लिए:

आकार 1

आपका कार्यक्रम कहीं से एक बाइट को पढ़ने के लिए है कि वेलग्रिंड पसंद नहीं करता है कोशिश कर रहा है की अवैध पढ़ा।

0x401569 पर

: मुख्य (: 395)

कोड ऐसा होता है (स्पष्ट रूप से strcmp inlined कर दिया गया है) में कहाँ

पता 0x0 malloc'd stack'd नहीं है या (हाल ही में) free'd

यह पता क्या था - 0x0 "न्यूल" है। शेष बयान सिर्फ इतना कहता है कि यह अमान्य क्यों है (यह स्टैक से नहीं है, यह कुछ ऐसा नहीं है जिसे आपने मॉलोक से प्राप्त किया है, और हाल ही में मुक्त नहीं किया गया है)। "हाल ही में" का उल्लेख किया गया है क्योंकि वाल्ग्रिंड सीमित मात्रा में मुक्त स्मृति के लिए मुक्त स्मृति का ट्रैक रखता है, इसलिए यह सुनिश्चित नहीं हो सकता कि इसे दस लाख मुक्त नहीं किया गया था - इस मामले में यह नहीं था, लेकिन यदि आप इस तरह का एक संदेश देखें, यह हो सकता है कि यह अमान्य हो गया है क्योंकि इसे उम्र पहले मुक्त कर दिया गया था। पता शून्य नहीं होगा (या शून्य के पास)।

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