Я пишу программу, которая использует Hashtable связанных списков для подсчета частоты слов.Программа подсчитает все слова, которые я ввожу вместе с частотой, однако после печати хеш-таблицы я получаю ошибку ошибки сегментации (дамп памяти).Когда я проверяю свою программу, она показывает, что я получаю ошибки в трех разных местах, которые читаются неверно, размера 8. Хотя я не уверен, как их исправить.Вот три разных места:
void freeTable(HashTablePtr table) {
int i;
ListPtr list;
if (table == NULL)
return;
for (i = 0; i < table->size; i++) {
list = table->table[i];
freeList(list);
}
free(table->table);
free(table);
}
HashTablePtr createTable(int tableSize) {
int i;
HashTablePtr table = (HashTablePtr) malloc(sizeof(HashTablePtr));
table->table = (ListPtr *) malloc(sizeof(ListPtr) * tableSize);
table->size = tableSize;
for (i = 0; i < table->size; i++) {
table->table[i] = createList();
}
return table;
}
void printTable(HashTablePtr table) {
ListPtr tempList;
NodePtr tempNode;
HashObjectPtr obj;
int i;
for (i = 1; i < table->size; i++) {
tempList = table->table[i];
if (tempList->size != 0) {
tempNode = tempList->head;
obj = tempNode->HashObject;
printf("%s\n\n", toString(obj));
}
}
}
Я думаю, что ошибка связана с использованием этих строк:
tempList = table-> table [i];
table-> table [i] = createList ();
но я не уверен, как это исправить.
Редактировать:
typedef struct hashtable HashTable;
typedef struct hashtable * HashTablePtr;
struct hashtable {
int size;
ListPtr *table;
};
Ошибки Valgrind:
999 ошибок в контексте 5 из 9:
== 73795 == Недопустимое чтение размера 8
== 73795 == при 0x400B7D: printTable (HashTable.c: 96)
== 73795 == по 0x400766: main (wf.c: 16)
== 73795 == Адрес 0x4c34048 равен 0 байтам после блока размером 8 alloc'd
== 73795 == в 0x4A0515D: malloc (vg_replace_malloc.c: 195)
== 73795 == by 0x400D05: createTable (HashTable.c: 17)
== 73795 == по 0x400753: main (wf.c: 14)
== 73795 ==
== 73795 ==
== 73795== 1000 ошибок в контексте 6 из 9:
== 73795 == Недопустимое чтение размера 8
== 73795 == при 0x400B2B: freeTable (HashTable.c: 128)
== 73795 ==по 0x40076E: main (wf.c: 17)
== 73795 == Адрес 0x4c34048 равен 0 байтов после блока размером 8 alloc'd
== 73795 == в 0x4A0515D: malloc (vg_replace_malloc.c:195)
== 73795 == по 0x400D05: createTable (HashTable.c: 17)
== 73795 == по 0x400753: main (wf.c: 14)
== 73795 ==
== 73795 ==
== 73795 == 1000 ошибок в контексте 7 из 9:
== 73795 == Недопустимое чтение размера 8
== 73795 == в 0x400D4C: createTable (HashTable.c: 25)
== 73795 == by 0x400753: main (wf.c: 14)
== 73795 == Адрес 0x4c34048 равен 0 байтов после блока размера 8 alloc'd
== 73795 == в 0x4A0515D: malloc (vg_replace_malloc.c: 195)
== 73795 == по 0x400D05: createTable (HashTable.c: 17)
== 73795 == по 0x400753: main (wf.c: 14)
ListPtr createList() {
ListPtr list;
list = (ListPtr) malloc(sizeof(List));
list->size = 0;
list->head = NULL;
list->tail = NULL;
return list;
}