【问题标题】:Creating dynamic sized array using MSVC C++ compiler使用 MSVC C++ 编译器创建动态大小的数组
【发布时间】: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(),旨在防止当您分配过多时此站点被命名为运行时事故。
  • @Raj HERE 你可以找到各种各样的信息为什么你不应该按照你的计划去做=)

标签: c++ arrays visual-c++ dynamic


【解决方案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;
}

你这样做的方式是在堆栈上分配,因此它必须是常量,而这种方式是在堆上,它可以是任何值。

我认为没有编译器选项可以改变它

【讨论】:

  • 但是在堆而不是堆栈上分配它时存在性能问题。
  • 请不要忘记删除内存!
猜你喜欢
  • 2018-10-02
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多