C语言哈希函数运行出现Core dumped问题求助
问题原因与修复方案
核心问题
程序触发Core dumped的直接原因是字符串数组未以NULL终止,导致第一个while循环越界访问内存:
- 你定义的
char *p[]={"pole","olep","mamao","omama"}仅包含4个有效字符串指针,数组末尾没有添加NULL作为终止标记。 - 第一个
while(*(p+j))循环会持续递增j,直到读取到NULL才停止。当j=4时,p[4]已经超出数组的合法范围,属于未定义行为——程序会读取栈上数组后的随机内存,可能因访问非法地址直接崩溃,或破坏栈上其他变量(比如后续for循环的计数器),导致后续哈希计算无法执行。
当你注释掉打印字符串的循环时,这个越界访问的操作被移除,程序自然能正常执行哈希计算逻辑。
修复方法
有两种简单的修复方式:
方式1:给数组添加NULL终止符
修改数组定义,在末尾加上NULL,让while循环能正确终止:
char *p[]={"pole","olep","mamao","omama", NULL};
方式2:用数组长度控制循环
直接通过数组的实际长度来限制循环次数,避免依赖NULL标记:
int j=0; // 计算数组元素个数:总字节数 / 单个元素字节数 int arr_len = sizeof(p) / sizeof(p[0]); while(j < arr_len){ printf("%s\n", p[j]); j++; }
额外优化建议
- 打印
uint64_t类型时,建议使用标准格式宏PRIu64(需包含<inttypes.h>头文件),替代%lu,提升代码可移植性:#include <inttypes.h> // ... printf("%" PRIu64 "\n", var); - 哈希函数中
(*s >> ((uu.h/(i+1)) % 5))的逻辑,当i+1 > uu.h时,uu.h/(i+1)结果为0,移位操作变为*s >> 0(无实际意义),如果需要更均匀的哈希分布,可以调整移位的计算逻辑,比如用(i % 5)替代当前的表达式。
内容的提问来源于stack exchange,提问作者Solruhama
相关产品推荐
相关产品推荐

