You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:15:04