所以我需要做一个特定的hashcode函数来满足特定的算法。在这个问题的背景下,算法并不是很重要。我有段故障,不知道怎么解决。我在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?
最佳答案
strncpy
如果缓冲区太小,则不为空终止其输出。由于这个原因,许多人认为它在几乎所有情况下都是一个糟糕的功能选择。
您的代码有另一个问题,即dst
不指向任何地方,但您试图通过它写入字符。你认为那些角色会去哪里?这可能会导致segfault,试图将字符写入尚未分配的随机内存位置。
假设您希望使用递归方法:不要每次都复制字符串,而是更改函数以传递字符串的长度。那么您不需要分配任何内存,也不需要浪费任何时间调用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];
}
注意-要避免整数溢出问题,请对哈希值使用无符号类型。
关于c - 分段故障,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26208966/