Если я хочу объявить динамический размер массива в основной функции, я могу сделать:
int m;
cin>>m;
int *arr= new int[m];
Следующее невозможно сделать, так как при компиляции компилятор должен знать размер каждого символа, кроме случаев, когда это внешний символ:
int m;
cin>>m;
int arr[m];
Мои вопросы:
Почему компилятор должен знать размер arr в приведенном выше коде? Это локальный символ, который не определен в таблице символов. Во время выполнения стек заботится об этом (так же, как и m). Это потому, что компилятор должен определить размер main () (глобального символа), который равен размеру всех объектов, определенных в нем?
Если у меня есть функция:
int func(int m)
Могу ли я определить int arr [m] внутри функции или все же мне придется сделать
int *a= new int[m]
Например :
int MyArray[5]; // correct
или же
const int ARRAY_SIZE = 6;
int MyArray[ARRAY_SIZE]; // correct
но
int ArraySize = 5;
int MyArray[ArraySize]; // incorrect
Вот также, что объясняется в Язык программирования C ++, Бьярне Страуструп :
Количество элементов массива, связанный с массивом, должно быть постоянным выражением (§C.5). Если вам нужны переменные границы, используйте вектор (§3.7.1, §16.3). Например:
Чтобы ответить на ваши вопросы:
1) В: Почему компилятор должен знать размер arr в приведенном выше коде?
A: Если вы сгенерируете вывод сборки, вы заметите «вычитание» некоторого фиксированного значения для размещения вашего массива в стеке
2) Вопрос: Могу ли я определить int arr [m] i … внутри функции?
A: Конечно, вы могли бы. И это станет недействительным в тот момент, когда вы выход функция 😉
По сути, вам не нужен «массив». «Вектор» C ++ был бы хорошей альтернативой:
std::vector<A> v(5, A(2));
Вот несколько ссылок, которые могут вам понравиться: