2017-01-03 19 views
1

構造体インスタンスへのポインタを持つハッシュテーブルを実装しています。ハッシュテーブルのリンクリスト(構造体付き)

構造体:(私の構造体のポインタを持つ)

typedef struct student 
{ 
    int matrikelnummer; 
    char *name; 
    struct student *next; 
} student; 

アレイ:

student *hash_table[SIZE]; 
... 
for (int i = 0; i < SIZE; i++) 
    hash_table[i] = NULL; 

私は適切なメモリ管理に私の構造体のインスタンスを作成しています:

char *name = malloc(100); 
student *temp = malloc(sizeof(student)); 
if (temp == NULL || name == NULL) 
    return; 

printf("Neuer Student hinzufuegen:\n"); 
printf("Name: "); 
scanf("%99s", name); 
temp->name = malloc(strlen(name) + 1); 
if (temp->name == NULL) 
    return; 
strcpy(temp->name, name); 
free(name); 
name = NULL; 

printf("Matrikelnumer: "); 
scanf("%d", &temp->matrikelnummer); 

temp->next = NULL; 

ここまでは正常に動作していますが、プログラムをデバッグしている間にtemp(structのインスタンス)をチェックすれば正常です。 hash_tableでポインタを変更するこの機能の終わりに [0]私の一時インスタンスに動作しているようです:

hash_table[0] = &temp; 
/* hash_table[get_hash_key(temp->matrikelnummer)] = &temp; */ 

私のプログラムがクラッシュし、私は次のようにその後の私のhash_tableのメンバーを印刷しようとした後:

printf("matrikelnumer: %d\n", hash_table[0]->matrikelnummer); 

出力:matrikelnummer:9741328 は(それ自体は%dで印刷されたアドレスのように見える)

と、それは次のコード行で名前を印刷しようとした後にクラッシュ:

printf("name: %s\n", hash_table[0]->name); 

変数に間違ってアクセスしていますか? 私はすでにメンバーにアクセスするためにいくつかの方法を試しましたが、そのほとんどがクラッシュしたり、私が従うことができないことをしています。

任意のヒントと感謝を助ける、それはなどコーディングスタイルに来るときも

+8

。 'hash_table [0] = &temp;'は確かに間違っていて、完全なエラーではないにしても少なくとも警告を吐くはずです。あなたは 'student **'を期待しているものに 'student ** 'を割り当てています。その行は 'hash_table [0] = temp;' ' – WhozCraig

+0

'となっています。ありがとう、それはかなり簡単なものでした:) –

+1

コーディングスタイル:1)' char * name = malloc(100); ... free(temp); 'メモリを割り当てずに、代わりに自動ストレージ("スタック ")を使用します:' char name [100]; '2)' scanf( "%99s"、name); '代わりに同じ機能で入力、割り当て、リンクリスト操作を実行せず、それぞれが1つのタスクを実行する2つまたは3つの機能を作成します。 – joop

答えて

3

バグがライン上にある:、

hash_table[0] = &temp; 

tempがすでにポインタであるので、あなたはstruct student**struct student*に配列要素を割り当てます残りのすべてのエラーが発生します。

変更:

hash_table[0] = temp; 
は杓子定規なレベルにあなたのコンパイラの警告を上げ、エラーとして扱う
関連する問題