1

我在任何地方都找不到类似的东西。我有一个指向哈希表的对象(链表)的指针数组:

LinkList * table[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
    table[i] = NULL;

在我的哈希表类的一个函数中,我需要调用数组中LinkList对象的函数之一。table我这样称呼它:

void HashMap::add_customer(string first, string last, string phone) {   
    int hash = get_hash(phone);
    if (table[hash] == NULL) {
        table[hash] = new LinkList;
    }
    table[hash]->add_customer(first, last, phone); // I HATE THIS LINE
}

一切都编译得很好,但是当我在运行时执行该table[hash]->add_customer()行时,我得到一个Segmentation Fault错误。当这条线被注释掉时,我没有收到任何错误,但显然,我不能将任何客户添加到我的哈希表中。这不是正确的语法吗?

4

3 回答 3

2

您必须将指针数组初始化为 NULL,因为它们将被分配在堆栈/堆上或带有垃圾值的任何地方......

LinkList * table[TABLE_SIZE];
memset(table, NULL, sizeof(LinkList *) * TABLE_SIZE);

假设您已正确初始化,请检查您的哈希并断言它们确实是哈希 < TABLE_SIZE

试试这个:

 int hash = get_hash(phone) % TABLE_SIZE;
于 2012-06-12T23:45:06.230 回答
0

对于哈希映射的行为,这个片段看起来是正确的。我会检查您的 LinkList 实现中的 add_customer 方法。尝试在此哈希映射之外使用您的链接列表,以确保它们按预期工作。

于 2012-06-12T23:45:26.173 回答
0

试试这个:

LinkList * table[TABLE_SIZE] = {};

这会使您的指针无效。


你能确认 get_hash 返回值 < TABLE_SIZE 吗?添加断言或其他内容。

于 2012-06-12T23:46:14.007 回答