0

これは、文字列値を格納するハッシュテーブルのコードです。「挿入」関数で線形プローブを使用するには、その特定のハッシュ値でポインターがNULLかどうかを確認する必要があります。挿入関数をまだ完了していませんが、挿入関数内のif(the_hash_table [n] == NULL)をチェック すると、ブランチに入らないため、スタックしています。「the_hash_table[1]」を出力すると値をハッシュする前に「faz」が出力されますが、そのステップの後で出力すると、いくつかの奇妙な文字が出力されます。どこが間違っているのですか?

 #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    /*
    creates a hash table of size 10
    */

    char** create_hash_table(){



        char* the_hash_table[10];   // defines a hash table to store strings

        *the_hash_table=malloc(sizeof(char*)*10); // allocates memory in the heap for the hash table
        int i;
        for(i=0;i<10;i++){ // this loop initializes the string pointers to NULL at the starting point of the hash table
            the_hash_table[i]=NULL;
        }
        return &the_hash_table; // returns the address of the hash table to the main memory

    }

    /*
    this is a method to insert a string into the relevant position of the hash table
    */

    void insert(char* the_string,char** the_hash_table){

        printf("%s",the_hash_table[1]);
        int n=hash(the_string);
        printf("%s",the_hash_table[1]);
        if(the_hash_table[n] == NULL)
            the_hash_table[n]=the_string;

    }
4

1 に答える 1

4

メモリが正しく割り当てられていません。

自動変数the_hash_tableをポインターの配列として定義します。いくつかのメモリを割り当て、そのメモリへのポインタを配列に入れます。そのポインター (および の他の要素the_hash_table) をすぐに null ポインターで上書きします。

次に、ローカル配列へのポインターを返しますが、関数が終了すると配列は存在しなくなります。定義されている関数から自動変数へのポインターを返すことは常に間違っています。

あなたがすべきことは次のとおりです。

char** create_hash_table(void) {
    char** the_hash_table = malloc(sizeof(*the_hash_table) * 10);
    for (int i = 0; i < 10; ++i) {
        the_hash_table[i] = NULL;
    }
    return the_hash_table;
}

つまり、the_hash_table割り当てられたメモリを指すローカル変数です。割り当てられたメモリのアドレスであるその値を返します。それなら、mainあなたはそうではfree(the_hash_table)ないでしょうfree(*the_hash_table)

また、あなたのhash関数では、文字列をコピーしても意味がありません: から文字を読み取るだけthe_string[i]です。strlen(the_string)+1それをコピーすることにポイントがあったとしても、そのために作成するバッファは1 バイト小さすぎstrlenます。

于 2012-10-18T13:11:35.700 に答える