分段故障

时间:2014-10-06 01:29:06

标签: c segmentation-fault

所以我需要制作一个符合特定算法的特定哈希码函数。该算法在这个问题的背景下并不重要。我遇到了一个段错,我不确定如何修复它。我在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以避免这种情况?

1 个答案:

答案 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];
}

注意 - 为避免整数溢出问题,请使用无符号类型作为哈希值。