Известен е като „масив с променлива дължина“. Той е динамичен в смисъл, че неговият размер се определя по време на изпълнение и може да се променя от извикване на извикване, но има 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