2012-09-09 43 views
-1

我有几个简单的问题: -阵列申报和解决

  1. 是按照正常的C++编译器下面的正确吗?

    int arr[3][4]; 
    void func(int *a, int m, int n) 
    { 
    int i,j; 
    cin>>i>>j; 
    cout<< a[i*n + j]; //is this way of addressing correct provided 0<=i<m and 0<=j<n 
    } 
    
    int main() 
    { 
    func((int*)arr, 3,4); 
    } 
    
  2. 如果数组的边界严格必须是一个常量表达式,为什么不将下列产生的编译器错误?

    int func(int m, int n) 
    { 
    int arr[m][n]; //m and n are not known until run time 
    } 
    
+0

根据严格的标准阅读,通常不可能像使用平面数组一样使用多维数组(超出前几个元素)。然而,这是经常被忽略的事情,因为我没有真正找到任何答案提到它 - 除了[one](http://stackoverflow.com/a/7273599/726300) 。 –

回答

2

根据一个普通的C++编译器是对下面的正确?

是的,因为标准规定甚至超过1维的数组在内存中是连续的。 但是!你误解了数组索引和长度 - 我和j必须分别小于分别比3和4。 3和4是阵列在其两个维度上的大小,并且不是最大可能的下标。

如果数组的边界必须是一个常量表达式,为什么下面不会生成编译器错误?

也许你正在使用支持此作为扩展编译器(GCC认为,锵等)

1

它实际上是未定义行为为你使用我的未初始化的值可以访问阵列a和j。否则,如果您正在使用正确计算数组索引(在边界内),那么它是有效的。

您可能在使用gcc扩展名为variable length array