C语言哈希表查找不存在元素时的内存读取错误修复
问题根源与修复方案
核心问题1:哈希表数组未初始化
你在initializeHashMap中用malloc分配了存储链表头指针的数组,但malloc不会初始化内存,数组里的每个元素都是随机野指针,而非预期的NULL。当查找不存在的元素时,访问这些野指针会触发内存读取错误。
修复方法:分配数组后,将所有元素初始化为NULL。可以用循环遍历,或者memset快速清零:
void initializeHashMap(struct hashMap* mp) { mp->capacity = 100; mp->numOfElements = 0; mp->arr = (struct node**)malloc(sizeof(struct node*) * mp->capacity); // 初始化所有桶的头指针为NULL for(int i = 0; i < mp->capacity; i++){ mp->arr[i] = NULL; } // 或者用memset:memset(mp->arr, 0, sizeof(struct node*) * mp->capacity); return; }
核心问题2:search函数返回局部变量
你在search函数里定义了局部数组char err[] = "No data found.";,这个变量存储在栈上,函数执行完毕后栈帧会被销毁,返回该数组的指针会导致未定义行为(比如打印乱码或程序崩溃)。
修复方法有两种:
方案A:使用静态字符串(简单但不可重入)
char* search(struct hashMap* mp, char* key) { int bucketIndex = hashFunction(mp, key); struct node* bucketHead = mp->arr[bucketIndex]; while (bucketHead != NULL) { if (strcmp(bucketHead->key, key) == 0) { return bucketHead->value; } bucketHead = bucketHead->next; } // 使用静态字符串,生命周期与程序一致 static char err[] = "No data found."; return err; }
方案B:返回NULL,让调用者处理(更安全)
char* search(struct hashMap* mp, char* key) { int bucketIndex = hashFunction(mp, key); struct node* bucketHead = mp->arr[bucketIndex]; while (bucketHead != NULL) { if (strcmp(bucketHead->key, key) == 0) { return bucketHead->value; } bucketHead = bucketHead->next; } // 未找到返回NULL return NULL; }
对应的main函数需要修改判断逻辑:
// 查找key4 char* result = search(mp, key4); if(result == NULL){ printf("No data found.\n"); }else{ printf("%s\n", result); }
额外注意事项
hashFunction里使用了INT16_MAX,需要包含头文件<stdint.h>,否则会编译报错。- 插入的key和value是栈上数组的指针,如果后续这些数组被修改,哈希表里的内容也会跟着变,若需要持久化存储,应该在
insert里用strdup复制字符串。
内容的提问来源于stack exchange,提问作者user3788160
相关产品推荐
相关产品推荐

