在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; }
修复要点:
- 哈希函数改成遍历输入字符串的每个字符,彻底解决越界问题。
- 删掉完全没必要的
malloc和free,哈希值是整数,根本不需要动态内存。 - 修正
printf的格式符,用%u对应无符号整数类型。 - 加了参数检查,避免没传参数时直接崩溃。
内容的提问来源于stack exchange,提问作者Sir Muffington
相关产品推荐
相关产品推荐

