1

独自のハッシュ テーブル データ構造を作成しようとしていますが、予期しない問題に遭遇しました。これは解決できず、満足のいく解決策がまだ見つかりません。

ほら、私はこのリンクされたリスト構造を持っています

struct Link
{
   int v;
   struct Link* next;
}

次に、ハッシュ テーブル構造内で、次のように配列リンク リストを追跡します。

struct Link** entries;

私が遭遇したのは、これが機能するためには、最初に次のように配列を初期化する必要があるということです:

entries = malloc(sizeof(struct Link*) * N);

for (i = 0; i < N; i++)
   entries[i] = malloc(sizeof(struct Link));

私が望むのはfor、構造体を初期化するループを実行する必要がないことです。これは、リンクされたリストが機能する方法ではないため、entries[x]実際に値が割り当てられるまで空白のままにしたいです。

ループを実行しないと、次のようになりforます。

if (entries[x] != NULL)  /* true, the array is initialized */
  entries[x]->v = value; /* SEGFAULT, there is no struct initialized */

ifLink 構造体をまだ割り当てていない場合、そのステートメントは false を返す必要がありますが、そうではありません。

この問題を解決する 1 つの方法は、リンク リストのすべての最初のリンクをその for ループで初期化し、値をチェックすることですが、それは私が望んでいることではありません。

それで、私が望むようにこれを解決する方法を知っている人はいますか?

4

3 に答える 3

1

まあ、あなたはできません。初期化されていないポインタは必ずしもNULL.

于 2012-09-01T08:27:06.353 に答える
1

次のように割り当てるcalloc代わりに使用できます。mallocentries

entries = calloc(sizeof(struct Link*),  N);
于 2012-09-01T08:31:46.803 に答える
0

でスペースを割り当てた後、ポインタ配列を初期化する必要がありますmalloc()for次のような別のループを使用できます。

for (i = 0; i < N; i++)
{
   entries[i] = NULL;
}

または、単にcalloc()配列を割り当てるために使用します。これにより、すべての要素がに設定され0ます。

entries = calloc(N, sizeof(struct Link*));

その後、必要に応じて要素を割り当てる必要があります。

if (entries[x] == NULL)
{
   entries[x] = malloc(sizeof(struct Link));
}
entries[x]->v = value; 
于 2012-09-01T08:38:02.213 に答える