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

在C语言中实现简易哈希函数时出现段错误求助

段错误原因分析及修复方案

几个致命问题导致段错误:

  • 字符串越界访问:hash_pw里的循环直接访问p[50]到p[46],但你输入的命令行参数长度几乎不可能到50,这会踩内存里不属于这个字符串的区域,直接触发未定义行为(大概率就是段错误)。
  • 内存操作完全乱套:
    • asd是int类型,你却把malloc返回的指针强转成int存进去,类型完全不匹配;后面又把哈希值覆盖这个变量,不仅丢了malloc的地址造成内存泄漏,最后free(asd)时传的是哈希值不是合法内存地址,肯定崩。
  • printf格式符用错:用%s输出整数asd,%s要的是字符串指针,你把整数当地址读,直接非法访问内存。
  • 没检查输入是否存在:如果运行程序时不传参数,argv[1]是NULL,hash_pw里访问p[i]直接就崩了。

修复后的代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

unsigned int hash_pw(const char* p) {
    unsigned int res = 0;
    // 改成遍历整个输入字符串,再也不会越界
    for (size_t i = 0; p[i] != '\0'; i++) {
        res += p[i] * (i + 1); // 简单哈希逻辑,你可以自己调整
    }
    return res;
}

int main(int argc, const char* argv[]) {
    // 先检查有没有传参数
    if (argc < 2) {
        fprintf(stderr, "请输入要哈希的字符串\n");
        return 1;
    }

    unsigned int hash_result = hash_pw(argv[1]);
    // 用%u输出无符号整数,别再用错格式符
    printf("哈希值:%u\n", hash_result);

    return 0;
}

修复要点:

  1. 哈希函数改成遍历输入字符串的每个字符,彻底解决越界问题。
  2. 删掉完全没必要的malloc和free,哈希值是整数,根本不需要动态内存。
  3. 修正printf的格式符,用%u对应无符号整数类型。
  4. 加了参数检查,避免没传参数时直接崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:47:21