为什么在用c ++中的[n] [n]声明之后我无法观察表达式[1] [1]?

时间:2011-05-15 08:51:20

标签: c++ eclipse gdb

我的代码:

#include <iostream>
using namespace std;
int main() {
    int n=5;
    int a[n][n];
    a[1][1]=5;
    return 0;
}

我试图在第6行的eclipse中观察表达式[1] [1]时出现此错误:

  

无法执行MI命令:   -data-evaluate-expression a [1] [1]来自调试器后端的错误消息:   无法执行指针数学运算   不完整的类型,尝试转换为   已知类型,或无效*。

我猜它是从gdb返回的?但是,我不知道为什么我不能看到那个价值?是不是“一个”是一个正常的多维数组?

3 个答案:

答案 0 :(得分:6)

由于一些奇怪的原因,除非你做到这一点,否则这不是有效的C ++

const int n = 5;

否则数组大小在运行时才正式未知。

答案 1 :(得分:4)

C ++不假设可变长度数组(VLA)。所以你的代码不是标准的符合代码。

如果使用g++ -pedantic进行编译,则无法编译。数组大小必须是常量表达式。但是在你的代码中,它不是。

所以写:

 const int n=5; //now this becomes constant!
 int a[n][n]; //the size should be constant expression.

让我们尝试使用上面的代码,因为它现在是完全符合标准的代码。

答案 2 :(得分:0)

为什么不更好地做一个动态的2D阵列呢?在这种情况下,您不必使n保持不变,并且可以动态确定大小。

int **arr, n;

arr = new int * [n]; // allocate the 1st dimension. each location will hole one array
for (i=0; i<n; i++)
{
  arr[i] = new int [n]; // allocate the 2nd dimension of one single n element array
                        // and assign it to the above allocated locations.
}

现在您可以访问aray arr[i][j]

自由反向

for (i=0; i<n; i++)
{
  delete [] arr[i]; // first delete all the 2nd dimenstion (arr[i])
}
delete [] arr; // then delete the location arays which held the address of the above (arr)