所以我需要制作一个符合特定算法的特定哈希码函数。该算法在这个问题的背景下并不重要。我遇到了一个段错,我不确定如何修复它。我在gdb中调试它,发现它访问了无效的内存地址。
这是我的代码:
int hash_code(const char* str){
int len = strlen(str);
char* dst;
if(len == 0 )
return 0;
else{
strncpy(dst, str, (len - 1));
return (hash_code(dst) * 65599) + str[len-1];
}
}
我非常有信心它来自dst,但我不知道如何解决它,以免得到seg故障。我将使用或初始化dst以避免这种情况?
答案 0 :(得分:4)
strncpy
不会终止其输出。出于这个原因,许多人认为在几乎所有情况下它都是一个糟糕的功能选择。
您的代码有另一个问题,dst
没有指向任何地方,但您尝试通过它编写字符。你认为那些角色会在哪里?可能这会导致你的段错误,试图将字符写入你尚未分配的随机存储位置。
假设您希望坚持使用递归方法:不要每次都复制字符串,而是更改函数以传递字符串的长度。那么你不需要分配任何内存,也不会浪费任何时间来调用strlen
:
unsigned int hash_code(const char *str, size_t len)
{
if ( len == 0 )
return 0;
return hash_code(str, len - 1) * 65599 + str[len - 1];
}
注意 - 为避免整数溢出问题,请使用无符号类型作为哈希值。