CS50 Speller代码fscanf循环触发Segmentation Fault问题求助
问题排查与修复方案
- 检查node结构体定义
如果你定义node时将word成员声明为字符指针char *word,而非长度为LENGTH+1的字符数组char word[LENGTH+1],那么strcpy(n->word, words)会操作野指针触发段错误。
修复方案二选一:- 修改node定义:将word成员改为
char word[LENGTH + 1] - 保留指针定义的话,在malloc node后新增分配word空间的代码:
n->word = malloc(LENGTH + 1); if (n->word == NULL) { free(n); printf("Not enough memory for word. \n"); return false; }
- 修改node定义:将word成员改为
- 检查hash函数返回值范围
若hash函数返回值大于等于hashtable(即table数组)的总长度,访问table[hashValue]会触发数组越界,直接导致段错误。请确保hash返回值始终落在[0, 数组长度-1]的合法区间内。 - 检查table数组初始化状态
作为全局变量的table指针数组如果未初始化为全NULL,赋值n->next = table[hashValue]时会操作野指针,后续链表操作会触发异常。程序启动时需遍历table数组将所有元素设为NULL。 - 可选优化:给fscanf加长度限制,避免字符串溢出
将循环内的fscanf改为fscanf(dictionaryPointer, "%45s", words),显式限制读取的字符串最大长度,避免意外的缓冲区溢出。
内容的提问来源于stack exchange,提问作者HakemHa
相关产品推荐
相关产品推荐

