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的聲明。在我看來,我正在分配,而不是寫這樣的錯誤令我感到困惑,我不知道該怎麼做。任何幫助表示讚賞。
謝謝...
我還沒有試圖爲其他結構分配內存。我在這部分代碼中的意圖是爲HashTable結構和指針數組分配內存。 – jobrien929
正確,正如我上面指出的那樣,你沒有這樣做。你是malloc'ing'指數= malloc(sizeof(HashTableT *))'(如果你剝離typedef)這是一個指針的大小,而不是你的結構。然後嘗試使用'index-> arrayPtr',它將在您malloc'd的內存之外。此時發生壞事。 –
啊,現在我明白了。將其更改爲'sizeof(struct HashTableT)'將錯誤排序。感謝您的幫助。 – jobrien929