我正在写一个程序,它使用链接列表的哈希表来计算单词的频率。程序将计算我输入的所有单词和频率,但是在打印哈希表之后,我得到一个分段错误(核心转储)错误当我仔细检查我的程序时,它显示我在三个不同的地方得到了错误,这些错误都是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=表->表[i];
表->表[i]=createList();
但我不知道怎么解决。
编辑:
 typedef struct hashtable HashTable;
 typedef struct hashtable * HashTablePtr;

 struct hashtable {
     int size;
     ListPtr *table;
 };

Valgrind错误:
第5个上下文(共9个上下文)中的999个错误:
==73795==无效读取大小8
==73795==at 0x400B7D:printTable(哈希表.c:96)
==73795==BY0x400766:主(wf.c:16)
==73795==Address 0x4c34048在大小为8的块分配后是0字节
==73795==0x4a055d时:malloc(vg_replace_malloc.c:195)
==73795==by 0x400D05:创建表(HashTable.c:17)
==73795==BY0x400753:主(wf.c:14)
==73795个==
==73795个==
==73795==1000个错误,在9的上下文6中:
==73795==无效读取大小8
==73795==at 0x400B2B:freeTable(哈希表.c:128)
==73795==BY0x40076E:主(wf.c:17)
==73795==Address 0x4c34048在大小为8的块分配后是0字节
==73795==0x4a055d时:malloc(vg_replace_malloc.c:195)
==73795==by 0x400D05:创建表(HashTable.c:17)
==73795==BY0x400753:主(wf.c:14)
==73795个==
==73795个==
==73795==1000个错误,在9的上下文7中:
==73795==无效读取大小8
==73795==at 0x400D4C:createTable(哈希表.c:25)
==73795==BY0x400753:主(wf.c:14)
==73795==Address 0x4c34048在大小为8的块分配后是0字节
==73795==0x4a055d时:malloc(vg_replace_malloc.c:195)
==73795==by 0x400D05:创建表(HashTable.c:17)
==73795==BY0x400753:主(wf.c:14)
 ListPtr createList() {
     ListPtr list;
     list = (ListPtr) malloc(sizeof(List));
     list->size = 0;
     list->head = NULL;
     list->tail = NULL;
     return list;
 }

最佳答案

HashTablePtr table = (HashTablePtr) malloc(sizeof(HashTablePtr));几乎肯定是错误的。您希望为哈希表分配足够的存储空间,但似乎您只是为指向哈希表的指针分配存储空间(您的HashTablePtr
如果您不再习惯于使用typedef'ing指针,而是按照下面的格式进行分配,您就不会遇到这种问题:

HashTable *table = malloc(sizeof *table);

10-08 18:59