2010-10-27 18 views
19

Valgind निम्न कोड में त्रुटि Invalid read of size 8 त्रुटि रिपोर्ट करता है।आकार 8 का अमान्य पढ़ने - Valgrind + C

मैं एक सरणी की घोषणा की, की तरह

struct symbol *st[PARSER_HASH_SIZE]; 

जब मेरे कार्यक्रम आरंभ नहीं हो जाता, इस सरणी में सभी तत्वों के रूप में 0.

memset(&st[0], 0, sizeof(st)); 

मेरे कार्यक्रम struct symbol और आवेषण के उदाहरण बनाता initailzied कर रहे हैं हैश मान के आधार पर उपरोक्त सरणी में। इस सरणी में कुछ तत्व शून्य होंगे और अन्य वैध मान होंगे।

निम्नलिखित कोड आवंटित आइटम हटाने के लिए कोशिश करता है और valgrind लाइन में शिकायत करता है, sym = st[i]; sym != NULL; sym = sym->next

struct symbol *sym = NULL; 

/* cleaning the symbol table entries */ 
for(i = 0; i < PARSER_HASH_SIZE; i++) { 
    for(sym = st[i]; sym != NULL; sym = sym->next) { /* <-- Valgrind complains here */ 
     free(sym); 
    } 
} 

मैं इस त्रुटि के लिए कारण समझने की कोशिश कर रहा हूँ।

कोई भी मदद महान होगी!

उत्तर

40

समस्या यह है कि आप sym को खाली कर रहे हैं, फिर (अब-मुक्त) डेटा से मूल्य तक पहुंचने का प्रयास कर रहे हैं: sym->next। structs को

struct symbol *st[PARSER_HASH_SIZE]; 

की अपनी एक सरणी का कहना है

struct symbol *next_sym = NULL; 

for(sym = st[i]; sym != NULL;) { 
    next_sym = sym->next; 
    free(sym); 
    sym = next_sym; 
} 
3
भी

इसकी स्पष्ट नहीं यदि आप सरणी structs या संकेत शामिल करने के लिए है:

आप शायद भीतरी पाश के लिए कुछ इस तरह चाहते हैं structs के लिए पॉइंटर्स। लेकिन फिर आप

"जब मेरा प्रोग्राम प्रारंभ होता है, तो इस सरणी के सभी तत्व 0 के रूप में initailzied हैं।"

memset(&st[0], 0, sizeof(st)); 

यह सरणी स्पष्ट करने के structs

तरह प्रविष्टियों इलाज है

for (int i = 0; i < PARSER_HASH_SIZE; i++) 
{ 
    st[i] = 0; 
} 
+0

यह structs की ओर इशारा शामिल करने के लिए है है। क्या आप मुझे बता सकते हैं कि इसे ठीक से कैसे शुरू किया जाए? –

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