Valgrind неверная ошибка записи с массивом указателей на структуры - PullRequest
1 голос
/ 13 ноября 2011

Я получаю сообщение об ошибке (ну, на самом деле, кучу ошибок) от 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.Мне кажется, что я размещаю, а не пишу, поэтому ошибка сбивает меня с толку, и я не могу понять, что с этим делать.Любая помощь приветствуется.

Спасибо ...

1 Ответ

7 голосов
/ 13 ноября 2011
index = malloc(sizeof(HashTable));

Маллока достаточно памяти для указателя , а не вашей структуры.

Это также иллюстрирует, почему typedef, которые скрывают подобный тип, сбивают с толку.

...