我整个周末都在进行此操作-试图找出我的段错误发生的位置。我将其范围缩小到此功能,并认为我知道“为什么”发生。仅当执行查找时,它在哈希表中的NULL字段中运行时才会发生seg错误。
表@@@输出中的@@@空值仅在段错误之前出现-从来没有其他地方。我在它后面有一个continue语句-甚至将案件放在while循环中。怎么仍然有问题呢?“下一个...”也不会出现。它仅以@@空值@@错误结束,并在之后出现seg错误。
有什么帮助吗?下面提供的代码
record *hashtable::lookup(keytype k)
{
if (!table) return NULL;
int i;
int pos = hash(k, i = 0);
if ((pos < 0) || (pos >= tsize)) return NULL;
i = 0;
while ((table[pos]->key != k && i < tsize) || (table[pos] == NULL && i < tsize))
{
cout << "next.." << endl;
i++;
pos = (hash(k, 0) + i*secondhash(k)) % tsize;
if (table[pos] == NULL)
{
cout << "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@null value in table@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" << endl;
continue;
}
else {
}
}
cout << "Got out of loop..." << endl;
if (table[pos]->key == k) return table[pos];
return NULL;
}
问题可能出在您的while
循环情况下。
条件可以首先访问,table[pos]->key
即使table[pos] == NULL
可以按照true
条件第二部分的建议进行访问也是如此。每次都会产生分段错误table[pos] == NULL
。一个简单的解决方案是交换逻辑或的两个部分。
您可以更换
while ((table[pos]->key != k && i < tsize) || (table[pos] == NULL && i < tsize))
经过
while ((i < tsize) && ((table[pos] == NULL) || (table[pos]->key != k)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句