Важливо мати чіткі визначення того, що означають терміни. На жаль, існує багато визначень того, що означають статичні та динамічні масиви.
Статичні змінні - це змінні, визначені за допомогою статичного розподілу пам'яті . Це загальна концепція, незалежна від C / C ++. У C / C ++ ми можемо створювати статичні змінні з глобальним, файловим або локальним діапазоном, як це:
int x[10];
static int y[10];
foo() {
static int z[10];
Автоматичні змінні зазвичай реалізуються з використанням виділення пам'яті на основі стеку . Автоматичний масив можна створити в C / C ++ так:
foo() {
int w[10];
Що це за масиви x, y, z
, іw
Спільне у є те, що розмір кожного з них є фіксованим і визначається під час компіляції.
Однією з причин того, що важливо розуміти різницю між автоматичним масивом і статичним масивом, є те, що статичне сховище зазвичай реалізоване в розділі даних (або розділі BSS ) об’єктного файлу, і компілятор може використовувати абсолютні адреси для доступу до масивів що неможливо із сховищем на основі стеку.
Під динамічним масивом зазвичай розуміють не той розмір, який можна змінити, а той, який реалізований за допомогою динамічного розподілу пам’яті з фіксованим розміром, визначеним під час виконання. У C ++ це робиться за допомогою new
оператора .
foo() {
int *d = new int[n];
Але можливо створити автоматичний масив із розміром виправлень, визначеним під час виконання, використовуючи alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
Для справжнього динамічного масиву слід використовувати щось на зразок std::vector
C ++ (або масив змінної довжини в C ).
Що було призначено для доручення у питанні OP? Я думаю, зрозуміло, що хотілося не статичного або автоматичного масиву, а такого, що використовував динамічний розподіл пам’яті за допомогою new
оператора або масив нефіксованого розміру, використовуючи, наприклад std::vector
.