调用含双指针参数的initTable分配哈希表时触发浮点异常问题
问题根因
你遇到的浮点异常核心原因是initTable初始化函数遗漏了对哈希表size成员的赋值:
- 主函数手动初始化时你主动执行了
ht1->size=10赋值操作,encodeKey函数中index %= table->size的取模运算除数合法,程序正常运行 - 调用
initTable函数初始化时,HashTable_T结构体通过malloc分配的内存未初始化,size成员是随机脏值,若内存初始值为0,取模运算除数为0就会直接触发浮点异常。
修复方案
修改initTable函数,补充对size成员的赋值逻辑即可:
void initTable(HashTable_T** table, int size){ // 可选:增加参数合法性和内存分配结果校验 if (table == NULL || size <= 0) { return; } (*table) = malloc(sizeof(HashTable_T)); if (*table == NULL) { return; } (*table)->size = size; // 补充size成员赋值,修复浮点异常 (*table)->items = calloc(size, sizeof(H_item_t)); };
其他可优化点
- 当前
H_item_t定义中value是int*指针类型,但赋值时直接把int类型的数值强制转成指针存储,在64位系统下会出现数值截断问题,建议直接把value的类型改为int,不需要用指针。 malloc、calloc返回值建议做非空校验,避免内存分配失败触发空指针访问崩溃。encodeKey的返回值类型建议和index变量一致改为size_t,避免类型转换溢出。
内容的提问来源于stack exchange,提问作者Gregor Peyton
相关产品推荐
相关产品推荐

