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

C语言哈希表双层结构体指针分配内存泄漏问题咨询

问题原因解答
  • 首先排查笔误问题
    你代码中定义的哈希表二级指针变量名为 hash_tables,但后续分配内存时写的是 hash_table[0],缺少末尾的s,如果实际运行代码存在该拼写错误,会直接访问非法内存,引发逻辑异常甚至崩溃;如果是你整理问题时的手误,可以忽略该问题。
  • 核心内存泄漏原因
    当你使用指针形式定义桶 struct Bucket** bucket 时:
    1. hash_tables[0]->bucket = malloc(sizeof(Bucket*)*10); 仅分配了10个Bucket*指针的存储空间,这10个指针默认是未初始化的野值,并非NULL
    2. 后续你操作哈希表(插入节点、释放内存)时,如果没有先将这10个指针初始化为NULL,会导致链表遍历、释放逻辑异常:比如释放时无法识别链表的终止位置,或是跳过了对bucket指针本身的释放,最终造成内存泄漏
      而你改成结构体内部数组 struct Bucket* bucket[10] 后,10个指针的存储空间是直接内嵌在Table结构体里的,不需要额外malloc,自然也不会出现额外分配的bucket数组未释放的问题,只要初始化时把数组内的指针设为NULL即可正常运行。
  • 第一种写法的修复方案
    修正后的分配代码如下:
// 修正变量名拼写
hash_tables[0] = malloc(sizeof(Table));
hash_tables[0]->bucket = malloc(sizeof(Bucket*)*10);
// 新增:初始化所有桶指针为NULL
for(int i=0; i<10; i++){
    hash_tables[0]->bucket[i] = NULL;
}

释放时按顺序释放即可避免泄漏:

// 先释放每个桶的链表节点
for(int i=0; i<10; i++){
    Bucket* cur = hash_tables[0]->bucket[i];
    while(cur != NULL){
        Bucket* temp = cur;
        cur = cur->next;
        free(temp);
    }
}
// 再释放bucket数组
free(hash_tables[0]->bucket);
// 最后释放Table本身
free(hash_tables[0]);
hash_tables[0] = NULL;

内容的提问来源于stack exchange,提问作者JamesTheProg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:57:01