2013-04-19 52 views
0

此函數是散列表的一部分。我正在傳遞一個散列表來搜索和一個關鍵字。初始化Valgrind錯誤

int HashSearch (Hash_list h, char* key) 
{ 
    struct ent *x = (struct ent *)malloc(10*sizeof(struct ent)); 
    for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) { 
     if (strcmp(x->pos, key)==0) { 
      return x->num; 
     } 
    } 
    return -1; 
} 

不幸的是,當我嘗試運行它,Valgrind的不斷給我的錯誤

==1741== Conditional jump or move depends on uninitialised value(s) 
==1741== at 0x4018DE: HashSearch (Hash.c:81) 
==1741== by 0x400FA7: function (Nine13.c:181) 
==1741== by 0x4009D8: main (Nine13.c:54) 
==1741== 
==1743== Conditional jump or move depends on uninitialised value(s) 
==1743== at 0x4018DE: HashSearch (Hash.c:81) 
==1743== by 0x400FA7: function (Nine13.c:181) 
==1743== by 0x4009D8: main (Nine13.c:54) 
==1743== 

(81號線的代碼以「爲」開始的行)。

我覺得我已經初始化了struct ent和傳入的哈希列表。怎麼了?

+0

將你的分割分割爲sep。所以你可以看看它的'h-> table'或'x'是否給你一個問題,然後回來。 – John3136

+5

您正在將內存分配給'x',然後立即在'for'循環中重新分配'x',以便泄漏內存。 –

+2

我的猜測是這個問題實際上位於'HashSearch'之外。 'key'肯定是空終止的? h-> table'中的所有條目以及它們的成員('pos','next'和'num')是否已初始化? – jerry

回答

0

使用memset()清除內存或使用功能calloc()而不是malloc()

+0

這是一般的好建議,但x會立即被重新分配,所以這不是Valgrind警告的原因(雖然它是內存泄漏)。另外,對複合數據類型使用其他形式的初始化通常會更好(memset和calloc都將所有內存位置設置爲相同的值,這對於複雜的結構可能沒有意義)。 – jerry

1

從您對我們評論的回覆看,您的問題看起來像是在函數之外,並且函數中使用的其中一個項目未正確初始化。這外面你確實有內存泄漏,在這部分代碼:

struct ent *x = (struct ent *)malloc(10*sizeof(struct ent)); 
      ^^ 
    for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) { 
     ^^^^^ 

你分配內存x,然後立即在for循環重新分配x,或許這就是你的意思做:

struct ent *x ; 
    for (x = h->table[hash(key, h->size)]; x!=0; x=x->next) { 
1

基於this other question,問題的確出現在h->table中的所有條目都不是初始化的。請注意,雖然在table上使用callocmemset將以非常高的概率解決問題,但它在技術上不可移植。雖然0保證評估等於空指針,但不保證位模式都是0 s。另外,正如在上面的其他線程和我的評論中指出的那樣,對於複雜的數據類型,您通常會需要其他「空」值。