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

CS50 pset5 speller程序无内存错误但valgrind测试失败问题求助

问题原因分析

存在两个核心错误:

  • 内存未完全释放(直接导致valgrind报错)
    你当前的unload函数只释放了每个哈希桶的第一个节点,桶下挂载的链表所有后续节点都没有被释放,就会出现你看到的“内存块仍可到达”的泄漏报错。你测试用的字典里有2个单词,正好对应valgrind报告里的2块未释放内存。
  • 哈希表桶数配置错误
    你定义的哈希桶数量N = 1,但你的hash函数返回的是首字母大写后减'A',返回值范围是0~25,当单词首字母不是A的时候,hash返回的下标会超过数组table的边界,直接导致数组越界访问,出现不可预知的运行错误。

修复方案

1. 重写unload函数,遍历释放每个链表的所有节点

替换原有unload函数:

bool unload(void)
{
    // 遍历所有哈希桶
    for (int i = 0; i < N; i++)
    {
        node* cursor = table[i];
        // 遍历当前桶的整个链表,逐个释放节点
        while (cursor != NULL)
        {
            node* temp = cursor;
            cursor = cursor->next;
            free(temp);
        }
    }
    return true;
}

2. 调整哈希桶数量匹配哈希函数逻辑

把N的定义改成至少26,匹配你当前hash函数的返回范围:

const unsigned int N = 26;

修改完上述两处问题后,valgrind的内存泄漏报错会消失,数组越界的潜在风险也会被解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:24:01