Чтобы выделить массив из foo_t
с, стандартный шаблон является одним из следующих:
foo_t *p = malloc(count * sizeof(foo_t));
foo_t *p = malloc(count * sizeof(*p));
Вы либо говорите: «дайте мне количество элементов размером с» ", где размер равен либо sizeof(foo_t)
, либо sizeof(*p)
.Они эквивалентны, но второй лучше, так как он избегает писать foo_t
дважды.(Таким образом, если вы измените foo *p
на bar *p
, вам не нужно будет поменять sizeof(foo_t)
на sizeof(bar_t)
.)
Итак, чтобы выделить массив int *
, замените foo_t
с int *
, выход:
int **p = malloc(count * sizeof(int *));
int **p = malloc(count * sizeof(*p));
Обратите внимание, что правильный размер sizeof(int *)
, а не sizeof(int **)
.Две звезды - это слишком много.Следовательно, первый фрагмент, в котором вы написали sizeof(int **)
, неверен.Кажется, это работает, но это просто удача.
Обратите внимание, что я не включил (int **)
приведение.Приведение будет работать, но это плохая идея, чтобы привести возвращаемое значение malloc()
.Приведение не является необходимым и может скрыть небольшую ошибку *.См. связанный вопрос для полного объяснения.
* А именно, забывая #include <stdlib.h>
.