C++调用void函数后数组未正确扩容,rehash内存异常问题求助
哈希表核心成员未正确更新
大概率是rehash后,你没有把哈希表结构体里的数组指针替换为新分配的内存,也没更新记录数组大小的变量。比如你在rehash函数里创建了新数组,但外部访问的还是原来指向旧数组的指针,旧数组被释放后,索引10之后的内存已经不属于你的哈希表,自然是垃圾数据。检查代码里是否有类似hash_table->array = new_array;和hash_table->size = new_size;的更新逻辑。新数组内存分配存在问题
先确认新大小的计算逻辑:原大小11的2倍是22,最近质数是23,你的质数查找函数是不是返回了错误值?另外,分配内存时要确保字节数计算正确,比如int* new_array = (int*)malloc(23 * sizeof(int));,如果漏写sizeof(int),实际分配的内存只有23字节,远小于需要的92字节(假设int是4字节),超出原大小的部分就是非法内存。旧元素迁移逻辑错误
迁移时要遍历旧数组的所有索引(0到10),如果循环条件写错(比如i < old_size - 1),会漏掉最后一个元素。另外,插入新数组时必须用新的哈希规则——因为哈希表大小变了,哈希值应该对新大小23取模,而不是原来的11,否则会出现索引越界或者插入位置错误,导致新数组看起来没正确填充。旧内存释放时机错误
如果在迁移完成前就释放了旧数组,迁移过程中读取的都是已释放的垃圾数据,插入到新数组的内容自然无效。正确顺序是:先分配新数组 → 把旧数组的所有有效元素插入新数组 → 更新哈希表的指针和大小 → 最后释放旧数组。
内容的提问来源于stack exchange,提问作者Daniel Vayman

