2015-02-05 64 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來代替。

相關問題