Когда мы создаем массив в стеке, большинство компиляторов захотят узнать размер массива, который будет определен во время компиляции, поэтому обычно мы не можем заставить пользователя ввести размер массива из стандартного ввода, но что, если мы вызываете функцию, и мы передаем это число, введенное пользователем, в функцию для создания массива?
разве эта функция не вызывалась во время компиляции?
например, если пользователь вводит 1, разве эта функция не вызывается во время выполнения? Так как пользователь будет определять, будет ли вызываться функция.
или это еще время компиляции?
#include <iostream>
void someFunction(int number){
int sampleArray[number];
for(int i = 0; i < number; i++){
sampleArray[i] = 0;
}
// I know what I'm doing is pointless but is it possible?
}
int main()
{
int number = 0;
int choice = 0;
std::cout << "do you want to create an array? press 1 for yes" << std::endl;
std::cin >> choice;
if (choice == 1){
std::cout << "enter size" << std::endl;
std::cin >> number;
someFunction(number);
}
}
с return sampleArray; вы возвращаете адрес локальной переменной и, следовательно, висячий указатель.
очень хороший момент





То, что вы используете, называется массивом переменной длины. Он не является частью стандарта C++, но некоторые компиляторы поддерживают его как расширение.
Чтобы ваш код соответствовал стандарту, не используйте его. Вместо этого используйте std::vector<int>.
std::vector<int> someFunction(int number){
std::vector<int> sampleArray(number);
// No need for this. sampleArray elements are zero initialized.
/*
for(int i = 0; i < number; i++){
sampleArray[i] = 0;
}
*/
return sampleArray;
}
number не является значением constexpr.
Итак, int sampleArray[number]; все еще недействителен C++ и является расширением VLA.
В случае, который вы показываете, в C (и большинстве компиляторов C++) пространство для массива зарезервировано в стеке при вызове функции.
Точно так же вы можете сделать это вручную, используя такие функции, как alloca().
VLA и alloca () не являются частью C++.
Что вы делаете, так это создаете массив переменной длины, что обычно является плохой практикой, если вы хотите создать свой массив статически, лучше дать ему значение фиксированной длины, иначе, если вам остро нужна переменная длина array, вы можете использовать динамическое размещение для создания вашего массива или вы можете использовать векторы из STL.
Это не только плохая практика, это недопустимо в C++.
Думаю, правильнее было бы назвать это динамическим управлением памятью. Также я очень сомневаюсь, что приведенный вами пример кода будет работать правильно. Например:
int sampleArray[number];
Также вызовет ошибку во многих компиляторах, и в конечном итоге вы все равно получите предупреждение в других компиляторах.
Вам не нужно использовать функцию для инициализации массива с другим размером. Вы можете просто сделать это с помощью указателя:
int size;
std::cin >> size;
int * array = new int[size];
Это будет работать в любом известном мне компиляторе и не вызовет предупреждений. Но вы должны иметь в виду, что вам придется удалить память, когда вам больше не нужен массив. Например, когда он вот-вот выйдет за рамки.
delete []array;
Начиная с C++ 11 вы можете использовать умный указатель. Они позаботятся о памяти массива вместо вас и удалят память.
int size;
std::cin >> size;
std::shared_ptr<int[]> array(new int[size]);
То же самое можно сделать с unique_ptr и так далее. Во многих случаях будет достаточно просто использовать std :: vector для любого хранилища типа int.
Предпочитайте std::unique_ptrstd::shared_ptr, потому что вы всегда хотите использовать самое узкое и строго регулируемое решение. Для этой задачи лучше обоих std::vector.
Во время компиляции ничего не вызывается.