2014-10-06 129 views
0

所以我需要制作一个特定的哈希码函数来满足特定的算法。算法在这个问题的背景下并不重要。我遇到了seg故障,我不知道如何解决它。我在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的,但我不知道如何解决它,没有得到赛格故障。我会用什么来初始化dst来避免这种情况?

+1

'strncpy(dst,str,(len-1));''dst'没有初始化。不能确保'dst'指向的内存。 – BLUEPIXY 2014-10-06 01:31:33

+0

你知道哪条线路会出现故障吗?有几种可能性,包括@BLUEPIXY行最可能指出 – Krease 2014-10-06 01:31:39

+0

@BLUEPIXY,所以我应该如何初始化dst? – Mark 2014-10-06 01:36:19

回答

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

注 - 为了避免整数溢出问题,用一个无符号类型的哈希值。