Использование sizeof для указателя на указатель на массив из 2-х чисел - PullRequest
0 голосов
/ 29 декабря 2010

Я объявил эту переменную:

float (**explosions)[4];

Это будет указывать на блок памяти с указателями на блоки памяти для массивов с плавающей запятой с 4 плавающими числами.

Когда я делаю блок памяти указателей на блоки памяти массивов с плавающей запятой, что я здесь помещаю. Должен ли я просто использовать пустые указатели? Это был бы вариант, но не очень хороший.

explosions = realloc(explosions,sizeof(What goes here? It will be the size of a pointer to an array of 4 floats) * explosion_number);

При создании блока памяти для массивов, я думаю, это нормально?

explosions[explosion_number] = malloc(sizeof(float) * 64);

То есть 16 массивов с 4 элементами. Причина, по которой мне нужно иметь 16 из этих массивов в памяти, заключается в том, что я могу удалить избыточную память и сделать указатель на эти массивы NULL, чтобы я знал, когда массивы освобождаются после избыточности и больше не требуется никакой обработки. На всякий случай, если вам интересно.

Спасибо за любую помощь.

1 Ответ

4 голосов
/ 29 декабря 2010

sizeof может работать с типом в скобках или с выражением. Когда вы делаете sizeof <expression>, тогда выражение проверяется только на его тип, но оно не оценивается, поэтому не может быть проблем с разыменованием нулевых указателей и т.

Это означает, что вы можете написать realloc и malloc вызовы так:

explosions = realloc(explosions, sizeof(*explosions) * explosion_number);
explosions[explosion_number-1] = malloc(16 * sizeof(**explosions));
  // -1 because explosions array runs from 0 to (explosion_number-1)
...