Это делает массив динамическим?
Это зависит от того, как вы определяете «динамический». VLA, конечно, не может расти или сокращаться или, другими словами, изменять свой размер после его создания. Это динамично, хотя в некотором смысле его длина неизвестна во время компиляции.
Является ли эта память выделенной в куче?
Как выделяется память для VLA, является специфичной для реализации. Вообще говоря, память для VLA выделяется из пространства в кадре стека вызывающего. Затем он автоматически освобождается, когда функция, в которой определяется VLA, возвращается к вызывающей стороне, или если VLA выходит за пределы области видимости.
Ближайший родственник VLA является alloca()
функцией, которая в значительной степени можно считать тот же эффект, по крайней мере, в С. Предполагая, что компилятор использует VLA таким же образом alloca()
реализован, вы можете думать об этих двух массивах как технически то же самое в C:
int *a = alloca(sizeof(int) * N);
int b[N];
VLA обладает, однако, более компактным и удобным синтаксисом. Но самое главное, VLA по своей природе имеет автоматическую продолжительность хранения и дает компилятору больше свободы решать, следует ли уничтожать/освобождать массив после выхода из области, где он был объявлен, или после возврата из функции.
Это становится очень важным в таких языках, как C++, где компилятор реализует RAII idiom и должен гарантировать уничтожение объектов с автоматическим временем хранения при выходе из их области.
Обратите внимание, однако, что VLA в настоящее время не является частью языка C++ и реализуется компилятором как нестандартное расширение. Но это expected to become standard in C++14.
C++ не имеет VLA, извините. Единственный способ, которым вы написали на работу, - использовать нестандартное расширение компилятора. – ScarletAmaranth
Я не знаю, что я делаю неправильно. Я использую компилятор Orwell Dev C++, и мой код также находится в файле .cpp. Я получаю точечный компилятор, который позволяет это сделать. – Hina
, но все же как привязка к работе VLA, даже в C – Hina