使用 MSVC C++ 编译器创建动态大小的数组
Posted
技术标签:
【中文标题】使用 MSVC C++ 编译器创建动态大小的数组【英文标题】:Creating dynamic sized array using MSVC C++ compiler 【发布时间】:2019-06-12 05:48:47 【问题描述】:我正在使用 Visual Studio 2013 Express 和 MSVC 编译器。
执行以下代码行时出现错误。
#include<iostream>
using namespace std;
int main()
int n;
cin>>n;
int a[n];
return 0;
它说表达式在我声明数组a
的行上必须有一个常量值。
我搜索并找到了这个c++ array - expression must have a constant value
它说您需要打开编译器选项以允许它。 如何在 Visual Studio Express 中设置该选项?
【问题讨论】:
使用标准且可移植的std::vector
,而不是非标准且不可移植的variable-length arrays。
@Someprogrammerdude 但是使用向量会将其分配在堆而不是堆栈上。将编译器更改为 gcc 是否允许我对数组进行动态大小分配?
可变长度数组是一个有争议的 C99 特性,C11 不得不再次将其设为可选。它不是 C++ 功能,MSVC++ 根本没有实现它。不可移植的替代方案是_malloca()
,旨在防止当您分配过多时此站点被命名为运行时事故。
Why aren't variable-length arrays part of the C++ standard?的可能重复
@Raj HERE 你可以找到各种各样的信息为什么你不应该按照你的计划去做=)
【参考方案1】:
你可以使用指针
int*a = new int [n];
您必须在离开a
的范围之前删除:
delete[] a;
但最好使用矢量:
vector<int> a(n);
你也可以使用 llvm smallvector,它针对没有堆分配的小型数组进行了优化,如果大小很小
llvm::SmallVector<int, 5> smallVector;
for(int i = 0; i < 5; i++)
smallVector.push_back(i); // No heap allocations have been performed up to this point.
smallVector.push_back(6); // heap allocation now
但请记住,编译器将决定分配的位置。 Smallvector
【讨论】:
但这会将它分配在堆内存区域上。我想在堆栈区域分配它 没有其他选择。如果 n 很小,Clang 的向量可能会在堆栈中分配。【参考方案2】:尝试以下方法:
#include<iostream>
using namespace std;
int main()
int n;
cin >> n;
int *a=new int[n];
delete[] a;
return 0;
你这样做的方式是在堆栈上分配,因此它必须是常量,而这种方式是在堆上,它可以是任何值。
我认为没有编译器选项可以改变它
【讨论】:
但是在堆而不是堆栈上分配它时存在性能问题。 请不要忘记删除内存!以上是关于使用 MSVC C++ 编译器创建动态大小的数组的主要内容,如果未能解决你的问题,请参考以下文章