いいえ、タイプが一致しません。
ハッシュ エントリのテーブル (つまりtable[i]
isの型)、 hash_entries へのポインタstruct hash_entry
のテーブル(つまりisの型)、または何か他のものを割り当てようとしていますか? コードの読み方に基づいて、最初のケースを想定していますが、それが間違っている場合はお知らせください。 table[i]
struct hash_entry *
のテーブルを動的に割り当てると仮定するとstruct hash_entry
、呼び出し元でのテーブルの宣言は次のようになります。
struct hash_entry *table; // 1 *, no array dimension
関数は次のように呼び出す必要があります
int result = maketable(&table, number_of_elements);
そして次のように定義されます
int maketable (struct hash_entry **table, size_t size)
{
int r = 0;
// sizeof **table == sizeof (struct hash_entry)
*table = malloc(sizeof **table * size);
// *ALWAYS* check the result of malloc()
if (*table)
{
size_t i;
for (i = 0; i < size; i++)
memset(&(*table)[i], 0, sizeof (*table)[i]);
r = 1;
}
return r;
}
指摘すべきことがいくつかあります。まず、 の結果をキャストしないでくださいmalloc()
。C89 の時点では、その必要はありません。 stdlib.h を含めるのを忘れた場合、またはmalloc()
スコープ内にプロトタイプがない場合、キャストは診断を抑制します。sizeof
次に、型の代わりにオブジェクトに対して演算子を使用できます。これにより、いくつかのメンテナンスの頭痛の種を減らすことができます (つまり、パラメーター リストで の型を変更した場合、それに伴って呼び出し table
を変更する必要はありません)。sizeof
最後に、テーブルのアドレスが関数に渡されていることに注意してください。ポインター値に書き込もうとしているので、そのポインターにポインターを渡す必要があります。
へのポインターのテーブルを作成しようとしていた場合struct hash_entry
、コードはほとんど同じで、間接的なレベルが追加されているだけです。
呼び出し元でのテーブルの宣言は、
struct hash_entry **table; // 2 *, no array dimension
関数は次のように呼び出す必要があります
int result = maketable(&table, number_of_elements);
そして次のように定義されます
int maketable (struct hash_entry ***table, size_t size)
{
int r = 0;
// sizeof **table == sizeof (struct hash_entry *)
*table = malloc(sizeof **table * size);
// *ALWAYS* check the result of malloc()
if (*table)
{
size_t i;
for (i = 0; i < size; i++)
(*table)[i] = NULL;
r = 1;
}
return r;
}
EDITmaketable
例にバグがありました。table
添え字を適用する前に逆参照する必要があります(*table)[i]
。テーブル ポインタ自体ではなく、 table
を指すものに添字を適用しています。
混乱して申し訳ありません。