Массивы, созданные в функциях, время компиляции или время выполнения? - PullRequest
0 голосов
/ 29 мая 2018

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

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

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

0 голосов
/ 29 мая 2018

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

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.

0 голосов
/ 29 мая 2018

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

0 голосов
/ 29 мая 2018

number не является значением constexpr.

, поэтому int sampleArray[number]; все еще не является допустимым C ++ и является расширением VLA.

0 голосов
/ 29 мая 2018

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

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

0 голосов
/ 29 мая 2018

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