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

C语言哈希表链表插入值异常、扩容阶段段错误问题咨询

第一段测试代码的问题

  • 哈希表未初始化:node* table[10]是局部栈数组,默认存储的是随机野指针,判断table[place] == NULL的结果完全不可靠,需要在定义时初始化为全空:node* table[10] = {NULL};
  • 插入逻辑写反:你已经通过malloc申请了存储正确单词的新节点n,但插入时执行了n = table[place],直接把新节点的指针覆盖成了哈希表存储的野指针,后续打印的n->word就是野指针指向的随机内存内容,所以出现乱码。
    正确的头插逻辑应该是:
    if(table[place] == NULL)
    {
        table[place] = n;
        n->next = NULL;
    }
    else
    {
        n->next = table[place];
        table[place] = n;
    }
    // 打印时直接输出新节点的内容即可
    printf("Word inside node: %s \n" , n->word);
    
  • 额外优化点:fgets会把输入末尾的换行符也读入wrd,不需要的话可以手动截断。

第二段字典加载代码的段错误原因

  • 核心触发点:字符串指针未分配内存,你定义了char *wrd = NULL,直接将空指针传给fscanf写入读取到的单词,程序会尝试往NULL地址写入数据,直接触发段错误。可以修改为栈数组char wrd[256](长度可根据字典最大单词长度调整),或者手动给wrd申请足够的堆内存。
  • 缺少文件校验:如果/dictionaries/large文件不存在、路径错误或者无读取权限,fopen会返回NULL,后续调用fscanf传入空文件指针也会触发段错误,需要加判空逻辑。
  • 冗余逻辑冲突:你在循环内部每次都重新定义anchor和end为NULL,这部分链表尾插的逻辑完全无效,还和后面的头插逻辑重复,建议直接删除这段无用代码。
  • 多余操作:连续两次调用strcpy(n->word, wrd)没有任何作用,保留一次即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:06