在函数,编译时间或运行时创建的数组?

时间:2018-05-28 21:20:17

标签: c++ c++11 variable-length-array

当我们在堆栈上创建一个数组时,大多数编译器都想知道在编译时确定的数组的大小,所以通常我们不能让用户从标准输入中输入数组的大小,但是如果我们调用一个函数并将从用户输入的数字传递给函数来创建数组呢?

是不是在编译时调用了这个函数?

例如,如果用户输入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 :(得分:2)

您使用的是一个可变长度数组。它不是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;
}

答案 1 :(得分:1)

number不是constexpr值。

所以,int sampleArray[number];仍然无效C ++并且是VLA扩展名。

答案 2 :(得分:0)

如果您在C(和大多数C ++编译器)中显示,则在调用函数时,数组的空间将保留在堆栈中。

同样,您可以使用alloca()等功能手动执行此操作。

答案 3 :(得分:0)

你正在做的是创建一个可变长度的数组,这通常是一个不好的做法,如果你想静态地创建数组,最好给它一个固定的长度值,否则如果你处于可怕的状态需要一个可变长度的数组,你可以使用动态分配来制作你的数组,或者你可以使用STL中的向量。

答案 4 :(得分:0)

我认为命名动态内存管理更为正确。此外,我真的怀疑你给出的示例代码将正常工作。 举个例子:

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等同样可以完成。 对于许多情况,只需对任何int数据类型存储使用 std :: vector 就足够了。