Нет.Ваши типы не совпадают.
Вы пытаетесь выделить таблицу записей хеша (т. Е. Тип table[i]
равен struct hash_entry
), таблицу указателей на hash_entries (т. Е. Тип 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;
}
EDIT В примерах maketable
произошла ошибка;table
необходимо разыменовать перед применением индекса, то есть (*table)[i]
.Мы применяем индекс к тому, что table
указывает на , а не к самому указателю таблицы.
Извините за путаницу.