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
相关产品推荐
相关产品推荐

