2015-02-05 44 views
1

我试图实现散列表,但我得到循环的运行时错误createHashTable()函数。任何人都可以告诉我为什么会显示这个“运行时错误”?它是否是StackOverflow错误?任何人都可以告诉我为什么显示“运行时错误”?

#include <iostream> 
using namespace std; 

#define LOAD_FACTOR 20 

struct ListNode{ 
    int data; 
    struct ListNode *next; 
}; 

struct HashTableNode{ 
    int bCount; // number of elements in the block 
    struct ListNode *next; 
}; 

struct HashTable{ 
    int tSize; // table size 
    int count; // total number of elements in the table 
    struct HashTableNode **hashTableNodeArray; 
}; 

int hashFunction(struct HashTable *h, int data){ 
    return data % h->tSize; 
} 

struct HashTable * createHashTable(int numberOfElements){ 
    struct HashTable *h = new HashTable; 
    h->count = 0; 
    h->tSize = numberOfElements/LOAD_FACTOR; 
    h->hashTableNodeArray = new HashTableNode *[h->tSize]; 
     for(int i = 0; i < h->tSize; ++i){ 
     // this is where it is showing runtime error 
     h->hashTableNodeArray[i]->bCount = 0; 
     h->hashTableNodeArray[i]->next = nullptr; 
    } 
    return h; 
} 

void deleteHashTable(struct HashTable *h){ 
    struct ListNode *node, *tmp; 
    for(int i = 0; i < h->tSize; ++i){ 
     node = h->hashTableNodeArray[i]->next; 
     while(node != nullptr){ 
      tmp = node; 
      node = node->next; 
      delete tmp; 
     } 
    } 
    delete[] h->hashTableNodeArray; 
    delete h; 
} 

int main(int argc, char **argv){ 
    struct HashTable *h = createHashTable(220); 
    deleteHashTable(h); 
    return 0; 
} 
+4

发布有关运行时错误的更多信息。 – 2015-02-05 12:55:41

+1

可能因为您以某种您不应该使用指针的方式导致[* undefined behavior *](http://en.wikipedia.org/wiki/Undefined_behavior)。使用调试器查找*发生崩溃的位置*。 – 2015-02-05 12:56:22

+2

邓诺。你在调试时发现了什么? – 2015-02-05 12:56:53

回答

4
h->hashTableNodeArray = new HashTableNode *[h->tSize]; 

此分配指针数组,但不是实际hashtablenodes。在下面的循环中,您尝试写入未定义行为的循环。

你缺少你的循环:

h->hashTableNodeArray[i] = new HashTableNode; 
+0

我怎么能错过!感觉很愚蠢! errr! 非常感谢你指出了这一点。 :) – user3484291 2015-02-05 13:04:15

2

的问题在这里:

h->hashTableNodeArray = new HashTableNode *[h->tSize]; 
for(int i = 0; i < h->tSize; ++i){ 
    // this is where it is showing runtime error 
    h->hashTableNodeArray[i]->bCount = 0; 
    h->hashTableNodeArray[i]->next = nullptr; 
} 

你分配一个指针数组,但实际上却并不让指针指向任何地方有效,这意味着它们的值是不确定(实际上看起来是随机的)。然后,您继续解引用这些未初始化的指针,并使用指针写入内存,但不知道,其中内存中的将写入。

这导致undefined behavior,很可能是你的崩溃。

解决方案?要么不要使用指针,要么为显式指针显式分配内存。我的建议是完全停止使用指针,创建适当的复制和移动构造函数,并使用std::vector来代替。

相关问题