Array [n] vs Array [10]-使用变量vs实数初始化数组


90

我的代码存在以下问题:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

返回以下错误:

error: variable-sized object 'tenorData' may not be initialized

而使用double tenorData[10]作品。

有人知道为什么吗?


4
讲一门语言会有所帮助。在C ++中,这种形式的数组需要具有编译时常量大小。
OrangeAlmondSoap

C ++,将代码块与mingw32-g ++编译器一起使用!
msmf14

谢谢,贾斯汀和@AndrewVarnerin,解决了它!在int之前添加const:const int n = 10; 解决了!
msmf14 2013年

Answers:


188

在C ++中,可变长度数组是不合法的。G ++将此作为“扩展名”(因为C允许),因此在G ++中(无需-pedantic遵循C ++标准),您可以执行以下操作:

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

如果需要“可变长度数组”(由于不允许使用适当的可变长度数组,因此在C ++中更好地称为“动态大小的数组”),则您必须自己动态分配内存:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

或者,最好使用标准容器:

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

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

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

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

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
谢谢,这是另一个好的解决方案。最后,我真正需要的是向量而不是数组!
msmf14

1
@ msmf14:是的,标准容器(如vector)非常有用。
2013年

调用“ std :: vector <[some class]> a(n);”时,向量解是否初始化每个元素?
贾斯汀

3
如果您分配的空间不大(如果比栈大小小),我更愿意将栈内存与alloca(3)和new一起使用。这样,您就不必担心释放内存,并且内存分配要快得多。
holgac

2
+1表示g ++允许。因为我没有观察到此错误,所以可以解释差异。
gebbissimo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.