2017-02-01 37 views
1

我對自己在C函數初學者的問題,說我有指針鏈表的數組,我想編寫一個函數來一個節點的指針添加到陣列中:C:功能傳球達陣輸入

void addhash(int value,struct node ** arr[]){ 
    struct node *p =(struct node*)malloc(sizeof(struct node)); 
    p->value=10; 
    arr[value]=&p; 
}; 

這是定義函數的正確方法嗎?當我在main中運行這個時,我嘗試添加節點的存儲桶仍然是NULL。

回答

1

arr[value]=&p正在有效地返回一個指向局部變量的指針,這永遠不是一件有效的事情。函數返回後,局部變量不存在。它看起來像你想要聲明的參數爲node *arr[]並將該行更改爲arr[value]=p。這將正確地保存指向您爲節點分配的內存的指針。

您可能還需要考慮是否更有意義,具有的功能僅分配並初始化node結構和返回,此時調用者可以將其添加到陣列中。

+0

您好,感謝它幫助了很多的反饋! – woshidashen

+0

我用struct node ** hashtable [10000]定義了我的數組; – woshidashen

+0

所以我想我應該改爲定義它像結構節點*哈希表[10000];並相應地重寫我的功能,然後再次感謝! – woshidashen

0

在你的例子中,你並沒有添加節點的指針,但是你正在向節點添加一個角色的角色。 如果你保存p的地址,那麼節點的指針就是p,那麼你就保存了指針的地址。我們有p是一個局部變量,所以當我們從函數返回時,它會錯位。規則:永遠不要試圖保存局部變量的地址,並在聲明該變量的函數之外使用它。

void addhash(int value,struct node * arr[]){ 
struct node *p =(struct node*)malloc(sizeof(struct node)); 
p->value=10; 
arr[value]=p; 
}; 

我希望我已經回答了你的問題

+0

你做到了!它非常感謝! – woshidashen