所以我需要做一个特定的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/

10-12 02:04