分割故障(核心转储)错误

问题描述:

我正在写一个使用链表的哈希表来计算单词频率的程序。程序会计算出我输入的所有单词,然后在打印散列表之后,我得到一个分段错误(核心转储)错误。当我使用我的程序valgrind时,它显示我在三个不同的地方发现了错误,这三个地方是大小为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

999错误9:
== 73795 ==大小的读出无效8
== 73795 ==在0x400B7D:printTable(HashTable.c:96)
== 73795 == by 0x400766:main(wf.c:16)
== 73795 ==地址0x4c34048是0字节之后大小为8的一个块alloc'd
== 73795 ==在0x4A0515D:malloc的(vg_replace_malloc.c:195)
== 73795 ==由0x400D05:CREATETABLE( HashTable.c:17)
== 73795 ==由0x400753:主(wf.c:在历境6 14)
== 73795 ==
== 73795 ==
== 73795 == 1000错误的9:
== 73795 ==大小的读出无效8
==在0x400B2B 73795 ==:freeTable(HashTable.c:128)
== 73795 ==由0x40076E:主(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:主(wf.c:在历境7 14)
== 73795 ==
== 73795 ==
== 73795 == 1000错误的9:
== 73795 ==大小的读出无效8
==在0x400D4C 73795 ==:CREATETABLE(HashTable.c:25)
== 73795 ==由0x400753:主(wf.c:14 )
== 73795 ==地址0x4c34048在大小为8的块后分配0块字节
== 73795 == at 0x4A0515D:malloc(vg_replace_malloc.c:195)
== 73795 == by 0x400D05:createTable( HashTable.c:17)
== 73795 ==由0x400753:主(wf.c:14)

ListPtr createList() { 
    ListPtr list; 
    list = (ListPtr) malloc(sizeof(List)); 
    list->size = 0; 
    list->head = NULL; 
    list->tail = NULL; 
    return list; 
} 
+0

'HashTablePtr'的定义和原始valgrind错误的类型将是有用的。 – James 2011-04-28 18:35:13

+0

您应该在调试器中运行该程序。这将告诉你在哪一行发生分段错误。 – sth 2011-04-28 18:35:47

+0

我想看看createList() – karlphillip 2011-04-28 18:37:35

HashTablePtr table = (HashTablePtr) malloc(sizeof(HashTablePtr));几乎肯定是错的。要为哈希表分配足够的存储空间,但似乎你分配的只是一个指针存储到一个Hashtable(您HashTablePtr

如果你把typedef'ing指针的习惯,而是遵循分配的方法在下面的形式中,你不会遇到这样的问题:

HashTable *table = malloc(sizeof *table); 
+0

的impl我试过了,再次运行它,它解决了我的问题。这是完全合理的。谢谢! – Kat 2011-04-28 18:43:12

+1

+1不用于键入指针。正确指点可能很复杂。使用typedef来隐藏自己的复杂性是很有意义的。 – AShelly 2011-04-28 18:53:24

的指针的大小始终是一个固定的大小和结构是相关的。例如,在64位平台上,它总是8个字节。基本上,sizeof (ObjectType)sizeof (ObjectType *)不一样。因此,在这种情况下,您最终会分配比您需要的内存少的内存,从而导致分段错误。