Он известен как "массив переменной длины". Она динамическая в том смысле, что ее размер определяется во время выполнения и может изменяться от вызова к вызову, но у нее есть класс хранения auto
, как и у любой другой локальной переменной. Я бы не стал использовать для этого термин «динамическое распределение», так как это только запутает.
Термин «динамическое выделение» обычно используется для памяти и объектов, выделенных из кучи, время жизни которых определяется программистом (new/delete, malloc/free), а не область действия объекта. Массивы переменной длины выделяются и уничтожаются автоматически, когда они входят в область действия и выходят из нее, как и любая другая локальная переменная с классом хранения auto
.
Массивы переменной длины не всегда поддерживаются компиляторами; в частности, VC++ не поддерживает C99 (и, следовательно, массивы переменной длины), и делать это не планируется. В настоящее время C++ их не поддерживает.
Что касается «безопасной привычки», помимо проблемы переносимости, существует очевидная возможность переполнения стека, если nObs
будет достаточно большим значением. Вы могли бы в некоторой степени защититься от этого, сделав nObs
меньшим целочисленным типом, например, uint8_t
или uint16_t
, но это не очень гибкое решение и делает смелые предположения о размере стека и выделенных объектах. assert(nObs < MAX_OBS)
может быть рекомендовано, но в этот момент стек уже может быть переполнен (хотя это может быть нормально, поскольку assert() в любом случае вызывает завершение).
[править] Использование массивов переменной длины, вероятно, допустимо, если размер не определяется извне, как в вашем примере. [/редактировать]
В целом, проблемы переносимости и безопасности стека предполагают, что лучше избегать массивов переменной длины IMO.
person
Clifford
schedule
23.02.2010