Ошибка сегментации (ядро сброшено) ошибка - PullRequest
1 голос
/ 28 апреля 2011

Я пишу программу, которая использует 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;
 }

Ответы [ 2 ]

7 голосов
/ 28 апреля 2011

HashTablePtr table = (HashTablePtr) malloc(sizeof(HashTablePtr)); почти наверняка не так. Вы хотите выделить достаточно памяти для HashTable, но кажется, что вы выделяете память только для указателя на HashTable (ваш HashTablePtr)

Если вы откажетесь от указателя typedef и вместо этого будете использовать метод выделения в следующей форме, вы не столкнетесь с такими проблемами:

HashTable *table = malloc(sizeof *table);
0 голосов
/ 28 апреля 2011

Размер указателя всегда фиксированный и зависит от архитектуры.Например, на 64-битных платформах это всегда 8 байтов.По сути, sizeof (ObjectType) - это не то же самое, что sizeof (ObjectType *).Таким образом, в этом случае вы в конечном итоге выделяете меньше памяти, чем нужно, что приводит к ошибкам сегментации.

...