C++哈希表findKey函数返回元素指针出现段错误如何解决
问题排查与修复方案
核心错误点
- 构造函数数组分配错误:你的
Hash类构造函数接收参数a作为哈希表大小,但实际分配数组时写死了80,而非使用传入的a值。如果哈希函数计算出的索引超过79,直接访问table[index]会发生数组越界,触发段错误。
错误写法:
修复后:Hash(a = 80){ size = a; elem = 0; table = new Table<X,Y>[80]; };// 补充参数类型+使用a分配数组 Hash(int a = 80){ size = a; elem = 0; table = new Table<X,Y>[a]; }; - 索引无边界校验:哈希函数返回的
index没有做范围校验,哪怕哈希表大小和分配的数组长度一致,也可能因为哈希函数实现问题返回负数、大于等于size的非法值,直接访问直接越界。 - 冲突未处理+无默认返回值:当前
findKey只判断了哈希对应索引位置的key是否匹配,没有处理哈希冲突的场景(比如开放寻址法需要探测后续位置、链地址法需要遍历链表),且如果没有匹配到key,函数没有返回任何值,属于C++未定义行为,也会触发内存异常。 - 类实现语法错误:
Hash构造函数的参数a没有声明类型,哈希函数的参数写为const X& key input存在语法错误,属于手误导致的潜在问题。 - Table类无默认构造函数:你当前的
Table类只实现了接收两个参数的构造函数,没有默认构造函数,new Table<X,Y>[n]时会调用默认构造函数初始化数组元素,编译阶段就会报错;如果临时补充了空实现的默认构造,那未插入数据的位置key是未初始化状态,直接执行table[index].key == keyinput比较也会触发未定义行为。
findKey函数修复示例(假设采用开放定址法处理冲突)
template<typename X, typename Y> Table<X,Y>* Hash<X,Y>::findKey(const X& keyinput){ int index = function(keyinput); // 先加边界校验 if(index < 0 || index >= size){ return nullptr; } // 简单线性探测处理冲突,最多遍历整个表 for(int i = 0; i < size; i++){ int cur = (index + i) % size; // 这里可以加判断:如果当前位置是空槽就直接返回nullptr,减少无效遍历 if(table[cur].key == keyinput){ return &table[cur]; } } // 没找到返回空指针,避免未定义行为 return nullptr; }
内容的提问来源于stack exchange,提问作者suckatcoding
相关产品推荐
相关产品推荐

