哈希表实现出现Segmentation Fault(段错误)求助
排查链地址法哈希表的Segmentation Fault问题
Segmentation Fault(段错误)在C语言里基本都是非法内存访问导致的,结合你实现的链地址法哈希表查找功能,我整理了几个最常见的出错点和排查步骤,你可以逐一检查:
1. 哈希表数组未正确初始化
这是最容易踩的坑!如果你只是声明了链表数组指针(比如struct Node **hash_table;),但没有用malloc为数组分配内存,也没有把每个桶初始化为NULL,那hash_table就是个野指针,访问hash_table[index]直接会触发段错误。
正确的初始化代码应该是这样的:
#define TABLE_SIZE 100 // 根据你的需求调整大小 // 分配哈希表数组空间 struct Node **hash_table = malloc(TABLE_SIZE * sizeof(struct Node *)); if (hash_table == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 初始化每个桶为NULL(非常重要!) for (int i = 0; i < TABLE_SIZE; i++) { hash_table[i] = NULL; }
2. 查找时未判断空指针
当某个哈希桶里没有任何节点(也就是hash_table[index] == NULL),如果你的查找代码直接去访问current->word或者current->next,就会对空指针解引用,直接触发段错误。
正确的查找逻辑应该先检查空指针:
struct Node* find_word(struct Node **hash_table, const char *word) { int index = hash_function(word); // 先判断索引是否越界 if (index < 0 || index >= TABLE_SIZE) { return NULL; } struct Node *current = hash_table[index]; // 遍历链表时,必须先检查current是否为NULL while (current != NULL) { if (strcmp(current->word, word) == 0) { return current; } current = current->next; } return NULL; }
3. 哈希函数返回的索引越界
如果你的哈希函数计算出的索引超出了哈希表数组的范围(比如数组大小是100,但返回了101),访问hash_table[101]就属于数组越界访问,这也是段错误的常见原因。
确保哈希函数最后用取模运算把索引限制在合法范围内,比如:
int hash_function(const char *word) { unsigned int hash = 0; while (*word != '\0') { hash = hash * 31 + *word++; // 更合理的哈希计算方式 } return hash % TABLE_SIZE; // 取模保证索引在[0, TABLE_SIZE-1] }
(这里用unsigned int避免负数索引,也是个容易忽略的小细节)
4. 输入处理的内存问题
如果你的输入读取代码有问题,比如用scanf("%s", word)时,word是未分配内存的指针,或者缓冲区空间不足导致溢出,也可能间接引发段错误。
比如要确保输入缓冲区足够大:
char word[100]; // 分配足够的栈空间 if (scanf("%s", word) != 1) { fprintf(stderr, "Failed to read input\n"); return 1; }
如果排查完这些还是没找到问题,你可以把完整的代码贴出来,我帮你更精准定位。
内容的提问来源于stack exchange,提问作者amethyst stan
相关产品推荐
相关产品推荐

