Array [n] vs Array [10] - 初始化具有变量与实数的数组

msm*_*f14 74 c++ arrays size initialization

我的代码出现以下问题:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Run Code Online (Sandbox Code Playgroud)

返回以下错误:

error: variable-sized object 'tenorData' may not be initialized
Run Code Online (Sandbox Code Playgroud)

而使用double tenorData[10]作品.

谁知道为什么?

Cor*_*lks 166

在C++中,可变长度数组是不合法的.G ++允许将其作为"扩展"(因为C允许),因此在G ++中(不-pedantic遵循C++标准),您可以:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++
Run Code Online (Sandbox Code Playgroud)

如果你想要一个"可变长度数组"(在C++中更好地称为"动态大小的数组",因为不允许使用适当的可变长度数组),你必须自己动态分配内存:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,使用标准容器:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>
Run Code Online (Sandbox Code Playgroud)

如果你仍然想要一个合适的数组,你可以在创建它时使用常量而不是变量:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)
Run Code Online (Sandbox Code Playgroud)

同样,如果你想从C++ 11中的函数中获取大小,你可以使用constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有分配太多(如果它与堆栈大小相比较小),我更喜欢使用带有alloca(3)和placement new的堆栈内存.这样您就不必担心释放内存,内存分配要快得多. (2认同)
  • +1表示g ++允许。因为我没有观察到此错误,所以可以解释差异。 (2认同)