2010-10-27 84 views
19

Valgrind在以下代碼中報告了錯誤Invalid read of size 8大小8的讀取無效 - Valgrind + C

我有一個數組聲明如下,

struct symbol *st[PARSER_HASH_SIZE]; 

當我的程序進行初始化,該陣列中的所有元素都initailzied爲0

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

我的程序創建的struct symbol和插入實例根據散列值將數據導入上述數組中。因此,此數組中的幾個元素將爲NULL,其他元素將爲有效值。

下面的代碼嘗試刪除分配的項目和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

你可能想是這樣的內部循環:

struct symbol *next_sym = NULL; 

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

也是其並不清楚,如果你數組是指包含結構或指針結構

struct symbol *st[PARSER_HASH_SIZE]; 

說,它的數組指向結構的指針。但後來你說

「當我的程序初始化時,此數組中的所有元素初始化爲0.」

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

這是治療像結構

的項,以清除陣列做

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

這意味着包含指向結構。你能告訴我如何正確初始化它嗎? – 2010-10-27 17:18:31