使用new运算符创建用户输入大小的数组

Shi*_*isa 8 c++ arrays dynamic-allocation

我有几个与数组相关的问题.我已经研究过,数组大小必须是常量的,声明/编译器必须知道它的值.但是使用GNU GCC编译器(C++ 11标准过滤器),我能够使用变量作为数组大小完美地编译和运行程序,同时动态声明所述数组(使用new)

int num;
cout << "How big an array? ";
cin >> num;
int *arr = new int [num];
Run Code Online (Sandbox Code Playgroud)

问题1)这被认为是标准吗?我的教授是矛盾的.

Ques2)如果它标准的,那么在创建之后是否可以扩展数组(或任何数组)的大小?

Ques3)同样,如果这个表达式是标准的,那么是否可以在函数中使用它 - 例如.使用函数创建这样的数组?(如果是这样,怎么样?)

(PS:嗨,我是新手,也是C++的新手)

mfo*_*ini 7

问题1)这被认为是标准吗?我的教授是矛盾的.

是的,这完全有效.请注意,您需要显式删除arrusing operator 指向的内存delete[].最好使用一个std::vector<int>能为你执行内存管理的方法.

您可能会误用可变长度数组(VLA),这在C++以下情况下是不允许的:

// same num as the one in your example
int arr[num]; // ERROR
Run Code Online (Sandbox Code Playgroud)

这是有效C但无效C++(C++ 14将包括VLA,尽管它们与CVLA 有一些差别).

Ques2)如果它是标准的,那么在创建之后是否可以扩展数组(或任何数组)的大小?

不,你不能扩展它.您可以分配更大的数组,复制元素并删除前一个元素.同样,如果您正在使用,这将自动完成std::vector<int>.

Ques3)同样,如果这个表达式是标准的,那么是否可以在函数中使用它 - 例如.使用函数创建这样的数组?(如果是这样,怎么样?)

当然是:

int *allocate(size_t size) {
    return new int[size];
}
Run Code Online (Sandbox Code Playgroud)

但再次使用std::vector:

int num;
cout << "How big an array? ";
cin >> num;
std::vector<int> arr(num); // num elements, all of them initialized to 0
// insert 42 at the end. reallocations(if any) are done automatically
arr.push_back(42); 
Run Code Online (Sandbox Code Playgroud)