定义一个常量/声明一个数组

时间:2012-07-17 15:42:59

标签: c++

我正在尝试声明两个数组,一个2D和一个1D。我知道尺寸需要是const值。因此,const值是从函数调用的返回值赋值的。这很好,但是当我使用派生值来声明数组时,COMPILE错误! WHY ???

这是我的代码:

int populateMatrixFromFile(string fname) {
std::ifstream fileIn;
int s = determineDimensions(fname);  // return value  (CONST INT)
const int size = s;                  // assign to const

cout << "Value returned from determineDimensions(): " << size << endl;

if (size > 10){
    cout << "Maximum dimensions for array is 10 rows and 10 columns. Exiting" << endl;
    return 1;
}

fileIn.open(fname.c_str(), ios::in); //opened for reading only.

float aMatrix[size][size];  // ERROR
float bMatrix[size];        // ERROR

但它可以在这里工作:

    // assign the pth row of aMatrix to temp

    const int alen = sizeof (aMatrix[p]) / sizeof (float);
    float temp[alen];                                    // WORKS!!!

    for (size_t i = 0; i < alen; i++) {
        temp[i] = aMatrix[p][i];
    }

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

任何数组中第二维,第三维等的大小始终是常量。期。标准非常明确。

如果在堆上使用new的数组形式分配变量,第一个维度(实际上是最后一个索引)可以是变量的,如下所示:

int size = 50;
float *p = new float[size];

.... do stuffs

delete[] p;

有些编译器允许在堆栈上使用可变大小的数组,但最好不要使用它。

答案 1 :(得分:0)

编译器对数组的常量大小强制执行此规则,因为它在编译时分配所需的内存。换句话说,计算数组大小所需的所有值必须在编译时知道。在您的第一个示例中,情况并非如此,因此编译器会抱怨。

如果你真的需要动态大小的数组,你应该使用指针和new []运算符来分配数组。您还需要记住使用delete []操作符将内存返回给系统并避免任何内存泄漏。