2017-02-01 24 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; 
}; 

これは関数を定義する正しい方法ですか?私がメインでこれを実行すると、ノードを追加しようとしたバケツはまだ何らかの形でNULLになっています。

答えて

1

arr[value]=&pは、決して有効なことではないローカル変数へのポインタを効果的に返しています。関数が返った後にローカル変数が存在しません。あなたが望むように見えるのは、パラメータをnode *arr[]と宣言し、その行をarr[value]=pに変更することです。これは、ノードに割り当てたメモリへのポインタを正しく保存します。

node構造体を割り当てて初期化し、それを返すようにして、呼び出し側が配列に追加できるようにするのがより理にかなっているかどうか考えてみてください。

+0

こんにちはに答えていることを願っています! – woshidashen

+0

構造体ノード**ハッシュテーブル[10000]で配列を定義しました。 – woshidashen

+0

だから、代わりにstruct node * hashtable [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

関連する問題