使用 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++ 编译器创建动态大小的数组的主要内容,如果未能解决你的问题,请参考以下文章

MSVC 19.11 / Visual C++ 2017:大小为 1 和 size_t 类型的初始值设定项列表被误解

如何在 C++ 中动态分配数组

您可以在 C++ 中使用“新”模拟动态数组大小吗?

在 MSVC 中压缩后可能的数据损坏? (C++)

MSVC(和 icc)自动调用 memset C++

如何使用 system() 函数 (MSVC) 编译 c++ 代码?