Массивы, созданные в функциях, время компиляции или время выполнения?

Когда мы создаем массив в стеке, большинство компиляторов захотят узнать размер массива, который будет определен во время компиляции, поэтому обычно мы не можем заставить пользователя ввести размер массива из стандартного ввода, но что если мы вызываете функцию, и мы передаем этот номер, введенный пользователем, в функцию для создания массива?

не вызывается ли эта функция во время компиляции?

например, если пользователь вводит 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);

   }
}

5 ответов

То, что вы используете, называется массивом переменной длины. Он не является частью стандарта 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.

Я думаю, что правильнее назвать это динамическое управление памятью. Также я действительно сомневаюсь, что приведенный вами пример кода будет работать правильно. Для примера:

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.

То, что вы делаете, - это создание массива переменной длины, что, как правило, является плохой практикой, если вы хотите создать свой массив статически, лучше присвоить ему значение фиксированной длины, иначе, если вы остро нуждаетесь в переменной длине массив, вы можете использовать динамическое распределение для создания вашего массива, или вы можете использовать векторы из STL.

В случае, если вы показываете, в C (и большинстве компиляторов C++) пространство для массива резервируется в стеке при вызове функции.

Точно так же вы можете сделать это вручную, используя такие функции, как alloca(),

Другие вопросы по тегам