Учитывая, что int
является параметром "size" для созданного count_table_t
, кажется, что вы должны как выделить сам count_table_t
, так и инициализировать его члены.
Инициализация элемента list_array
также включает выделение памяти, поэтому она будет выглядеть следующим образом:
count_table_t *table_allocate(int size)
{
count_table_t *table = malloc(sizeof *table);
int i;
table->size = size;
table->list_array = malloc(size * sizeof table->list_array[0]);
for (i = 0; i < size; i++)
table->list_array[i] = NULL;
return table;
}
Однако вам также необходимо проверить наличие некоторых ошибок: умножение size
на sizeof table->list_array[0]
может переполниться, и любой из вызовов malloc()
может завершиться ошибкой. Таким образом, функция должна выглядеть примерно так:
count_table_t *table_allocate(int size)
{
count_table_t *table;
int i;
/* Check for overflow in list allocation size */
if (size < 0 || size > (size_t)-1 / sizeof table->list_array[0])
return NULL;
table = malloc(sizeof *table);
if (table == NULL)
return NULL;
table->size = size;
table->list_array = malloc(size * sizeof table->list_array[0]);
if (table->list_array == NULL) {
free(table);
return NULL;
}
for (i = 0; i < size; i++)
table->list_array[i] = NULL;
return table;
}
(Обратите внимание, что (size_t)-1
- это константа, равная максимальному значению size_t
, которое является типом параметра для malloc()
).