0

ハッシュ テーブルの値を検索する関数を作成しています。6 行目に到達するたびに実行時エラーが発生するのはなぜですか? 助けてください!

int* value = 0;
printf ("find return value: %d \n", find(keyList[i], value));

上記の 2 行は、main で使用される関数呼び出しです。

int find( char *key, int *p_ans ){
int hashValue = hash(key);
entry* newTable = table[hashValue];
while (newTable != NULL){
    if ((newTable -> key) == key){
        *p_ans = newTable -> val; // THE ERROR LINE
        return 1;
    }
    newTable = newTable -> next;
}
return 0;
}
4

4 に答える 4

3

なぜならp_ans == NULL。通話を次のいずれかに変更します。

スタック

int value;

if (find(keyList[i], &value)) {
    printf ("find return value: %d\n", value);
}
else {
    printf ("not found\n");   
}

ヒープ

int *value = malloc(sizeof(int));

if (find(keyList[i], value)) {
    printf ("find return value: %d\n", *value);
}
else {
    printf ("not found\n");   
}

free(value);

ポイントは、整数にスペースを割り当てる必要があるということです。ローカル変数がある場合は、int valueそのアドレスを渡すことができfind、変数の値を変更します。

持っている場合int *valueは、ポインターがあります。このポインターは、どこかの int を指している必要があります。malloc値にスペースを割り当てintます。

書き込みint *value = 0では、値が 0 の int は作成されず、値が NULL の intポインターが作成されます (0 は、ポインター値として使用される場合は NULL を意味します)。この NULL ポインターを逆参照することはできません。を呼び出すとfind(keyList[i], NULL)、NULL ポインターが逆参照され、プログラムがクラッシュします。p_ans == NULL*p_ans

それでも意味が分からない場合は、次の 2 つのコード スニペットを検討してください。最初のものはクラッシュします。2番目のものは機能します。理由がわかりますか?

// Bad
int *pointer = NULL;
if (find(keyList[i], pointer))

// Good
int value;
int *pointer = &value;
if (find(keyList[i], pointer))
于 2012-10-27T18:31:39.303 に答える
3

int関数の外側に割り当てる必要があります。スタック上またはヒープ上。スタックに割り当てるには、次のようにします

int ans;
find(key, &ans);

ヒープに割り当てるには、次のようにします。

int* p_ans = new int;
find(key, p_ans);
...
delete p_ans;
于 2012-10-27T18:34:09.393 に答える
3

これを設定しています:

*p_ans = newTable -> val; // THE ERROR LINE

このためには、p_ans で malloc する必要がありますが、p_ans ポインターは 0 であり、0 を指す「値」変数から取得されます。これが問題です

次の行を追加します。

value = (int *)malloc(sizeof(int));
于 2012-10-27T18:34:51.263 に答える
1

へのポインタを渡すからですNULL。関数にポインターを渡すために実際にポインターを宣言する必要はありません。代わりに、アドレス演算子を使用します&

int value = 0;
printf ("find return value: %d \n", find(keyList[i], &value));
/* Using address-of operator here -------------------^ */
于 2012-10-27T18:35:08.827 に答える