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

Pset5 Speller拼写检查程序故障求助:无法处理基础词汇与字符

拼写检查器代码错误排查与修复

核心错误1:unload函数逻辑完全错误

当前unload函数在释放第一个节点后就直接return true,仅释放了哈希表第一个桶的第一个节点,其余所有节点都未被释放,且函数最终会返回false(循环根本走不完),这会导致内存泄漏,同时直接导致check50的卸载测试失败。

错误代码片段:

while (cursor != NULL)
{
    node *tmp = cursor;
    cursor = cursor->next;
    free(tmp);
    return true;  // 此处错误:提前返回,未完成所有节点释放
 }

修复方法:
移除循环内的return true,遍历完当前桶的所有节点后,继续处理下一个桶。等所有桶都处理完毕,再统一返回true:

bool unload(void)
{
    // 遍历所有哈希桶
    for (int j = 0; j < N; j++)
    {
        node *cursor = table[j];
        // 遍历当前桶的链表
        while (cursor != NULL)
        {
            node *tmp = cursor;
            cursor = cursor->next;
            free(tmp);
        }
    }
    return true;
}

核心错误2:load函数存在资源泄漏风险

当malloc分配节点失败时,直接return false,但未关闭已打开的字典文件,会导致文件资源泄漏。这虽不是check50全部失败的主因,但属于代码规范问题。

修复方法:
在malloc失败时,先关闭文件再返回:

node *n = malloc(sizeof(node));
if (n == NULL)
{
    fclose(d);  // 新增:关闭已打开的文件
    return false;
}

潜在优化点:哈希函数效率提升

当前哈希函数仅对字符ASCII值求和取模,会导致大量哈希冲突,影响查找效率(不会导致测试失败,但会降低性能)。可改用更分散的哈希算法,比如:

unsigned int hash(const char *word)
{
    unsigned int hash_val = 0;
    for (int i = 0; word[i] != '\0'; i++)
    {
        hash_val = hash_val * 31 + tolower(word[i]);
    }
    return hash_val % N;
}

其他验证点

  • 全局哈希表table默认初始化为NULL,全局变量在静态存储区默认初始化为0(即NULL),这部分逻辑正常。
  • check函数逻辑正确:使用strcasecmp实现大小写不敏感比较,遍历链表查找单词的流程无问题。
  • size函数依赖全局变量dictionary_size,题目场景下为单次加载字典,计数逻辑正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 23:15:48