Вы хотите выделить массив из nb_birds
указателей на bird
структуру, поэтому размер для выделения составляет nb_birds * sizeof(bird *)
.
Затем вы хотите сохранить указатель на этот массив, поэтому приведение должно осуществляться по адресу первого элемента - адресу bird *
, т.е. bird **
.
Следовательно,
n->birds = (bird **) malloc(sizeof(bird *) * nb_birds);
p.s. Если вы хотите выделить N
объекты, на которые указывает ptr
, вы можете написать или, по крайней мере, думать как
ptr = (typeof(ptr)) malloc(sizeof(*ptr) * N);
Обновление:
Это должно быть отмечено, что malloc
возвращает указатель void *
, который совместим с любым типом указателя без явного приведения. Таким образом, указанная строка программы может быть такой короткой, как
ptr = malloc(N * sizeof(*ptr));
Некоторые программисты, несмотря на то, что они хорошо осведомлены об этом свойстве void *
, настоятельно предпочитают использовать явное приведение в таких случаях. Я не один из них, но я учитываю такие приведения как стилистические предпочтения (например, ()
для оператора sizeof
). Поэтому я оставил приведенный выше код, потому что его использует OP, и подумал, что это его выбор.
Тем не менее необходимо (по крайней мере, для полноты ответа и для дальнейших читателей) отметить, что такое приведение составляет ненужных и чрезмерных .
.
Спасибо Полу Огилви и chux за примечания пациента в комментариях.