2012-02-06 4 views
0

初心者、アドレスにデータを格納し、Cの変数のアドレスを変更しますか?ここ

は、私は言葉そのもののためのchar配列を含む単語のための構造体を持っている(構造体は私の質問に関係のない他の機能を持っている)、私はそれを保存しようとしていますハッシュマップ。ワード構造体ポインタの配列です。私のプログラムでは、新しい単語が見えるたびに、新しい単語structを作成し、文字配列mallocを作成します。しかし、ループを数回実行すると、別のハッシュマップの場所にあっても古い単語が新しい単語に変更されます。

私は新しいアドレスに新しい単語の構造体ポイントを作成するループを持つことが可能ですか?

struct words add; 
int b; 
for(b = 0; b < strlen(LowerCaseCopy); b++) 
{ 
    add.word[b] = '\0'; 
} 
for(b=0;b< strlen(LowerCaseCopy);b++) 
{ 
add.word[b] = LowerCaseCopy[b]; 
} 
hashmap[hashf] = &add; 

これは問題のコードです。

私の問題の例: ループの最初のスルースルー、私は特定のハッシュマップスロットに格納されているappleにadd.wordを設定しました。 ループの次回の実行で、add.wordをオレンジ色に設定しました。これは別のスロットに保存されています。問題は、最初のスロットではリンゴを保存しておらず、代わりにオレンジ色を保存しているので、オレンジ色の2つのスロットがあり、これは私が望んでいないものです。これをどうやって解決するのですか?

+0

どのように 'hashf 'の値を取得しますか?それは変わったのですか? – Philip

+0

'b

+0

はい、hashfが変更されています、これは私のコードの単なるセクションです、私はループ内にこのセクションを持っています。ループの各反復で変数を再利用すると、アドレスは変更されませんか? – Kevin

答えて

0

単純な解決策は、別の機能でハッシュマップにエントリを追加する機能を追加することです。この関数は、新しいwords構造を割り当て、ハッシュマップにすることを置く:

void add_to_hashmap(struct something *hashmap, char *lower_case_word) 
{ 
    /* Using "calloc" we don't have to manually clear the structure */ 
    struct words *words = calloc(1, sizeof(struct words)); 

    /* Copy +1 to include the terminating '\0' */ 
    memcpy(words->word, lower_case_word, strlen(lower_case_word) + 1); 

    /* Replace this with whatever you use to calculate the hash */ 
    int hashf = calculate_hash(lower_case_word); 

    hashmap[hashf] = words; 
} 

あなたは、エントリを削除した場合(すなわちNULLに設定する)あなたが最初にそれを解放するために覚えておく必要があります。

+0

恐ろしい!私ができるなら、私はあなたを抱きしめるだろう!本当にありがとう!あなたの助けに感謝 – Kevin

関連する問題