2014-10-06 134 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]; 
} 

注 - 爲了避免整數溢出問題,用一個無符號類型的哈希值。