2011-11-13 56 views
1

我從valgrind得到一個錯誤(實際上,大量的錯誤實際上),我在排序時遇到了問題。Valgrind無效的寫入錯誤,指向結構的指針數組

我正在使用此代碼以聲明一個結構:

struct HashTableT { 

HashFuncT hashFunc; 
// array of SortedList's 
SortedListPtr* arrayPtr; 
}; 

typedef struct HashTableT* HashTable; 

arrayPtr意味着是一個指針指向其他結構的數組。 然後爲它後來與此分配內存:

HashTable index; 
index = malloc(sizeof(HashTable)); 
memcheck(index); 
index->hashFunc = func; 
index->arrayPtr = malloc(sizeof(SortedListPtr) * size); 
memcheck(index->arrayPtr); 
// initialize array 
int i; 
for (i = 0; i < size; i++) { 
    index->arrayPtr[i] = NULL; 
} 
return index; 

Valgrind是給我這個錯誤:

==18735== Invalid write of size 4 
==18735== at 0x80497F1: HTCreate (chainedhash.c:35) 
==18735== by 0x8049727: main (main.c:457) 
==18735== Address 0x402e02c is 0 bytes after a block of size 4 alloc'd 
==18735== at 0x4005B83: malloc (vg_replace_malloc.c:195) 
==18735== by 0x804979B: HTCreate (chainedhash.c:32) 
==18735== by 0x8049727: main (main.c:457) 

第35行是一個用malloc的聲明。在我看來,我正在分配,而不是寫這樣的錯誤令我感到困惑,我不知道該怎麼做。任何幫助表示讚賞。

謝謝...

回答

7
index = malloc(sizeof(HashTable)); 

的malloc的內存不足的指針,不是你的結構。

這也說明了爲什麼像這樣隱藏類型的typedefs使事情變得混亂。

+0

我還沒有試圖爲其他結構分配內存。我在這部分代碼中的意圖是爲HashTable結構和指針數組分配內存。 – jobrien929

+0

正確,正如我上面指出的那樣,你沒有這樣做。你是malloc'ing'指數= malloc(sizeof(HashTableT *))'(如果你剝離typedef)這是一個指針的大小,而不是你的結構。然後嘗試使用'index->​​ arrayPtr',它將在您malloc'd的內存之外。此時發生壞事。 –

+0

啊,現在我明白了。將其更改爲'sizeof(struct HashTableT)'將錯誤排序。感謝您的幫助。 – jobrien929