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

哈希表实现出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:35:46