объявление массива динамических размеров

Если я хочу объявить динамический размер массива в основной функции, я могу сделать:

 int m;
cin>>m;
int *arr= new int[m];

Следующее невозможно сделать, так как при компиляции компилятор должен знать размер каждого символа, кроме случаев, когда это внешний символ:

 int m;
cin>>m;
int arr[m];

Мои вопросы:

  1. Почему компилятор должен знать размер arr в приведенном выше коде? Это локальный символ, который не определен в таблице символов. Во время выполнения стек заботится об этом (так же, как и m). Это потому, что компилятор должен определить размер main () (глобального символа), который равен размеру всех объектов, определенных в нем?

  2. Если у меня есть функция:

    int func(int m)
    

    Могу ли я определить int arr [m] внутри функции или все же мне придется сделать

    int *a= new int[m]
    

3

Решение

Например :

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). Например:

2

Другие решения

Чтобы ответить на ваши вопросы:

1) В: Почему компилятор должен знать размер arr в приведенном выше коде?

A: Если вы сгенерируете вывод сборки, вы заметите «вычитание» некоторого фиксированного значения для размещения вашего массива в стеке

2) Вопрос: Могу ли я определить int arr [m] i … внутри функции?

A: Конечно, вы могли бы. И это станет недействительным в тот момент, когда вы выход функция 😉

По сути, вам не нужен «массив». «Вектор» C ++ был бы хорошей альтернативой:

std::vector<A> v(5, A(2));

Вот несколько ссылок, которые могут вам понравиться:

1

По вопросам рекламы [email protected]