Динамическое распределение памяти и указатели? - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь понять разницу между этими двумя фрагментами.Оба они работают нормально.

int rows = 4;

int **p = malloc(rows * sizeof(int **)); //it works without type casting

и

int**p = (int **) malloc(rows * sizeof(int*)); // using casting method.

Что означает sizeof(int**)?

1 Ответ

0 голосов
/ 19 февраля 2019

Чтобы выделить массив из 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>.

...