数组声明和寻址

时间:2012-09-09 09:28:03

标签: c++ compiler-construction compiler-errors

我有几个直截了当的问题: -

  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
    }
    

2 个答案:

答案 0 :(得分:2)

  

根据普通的c ++编译器,以下是否正确?

是的,因为标准规定甚至具有多于1维的数组在内存中是连续的。 但是!你误解了数组索引和长度 - i和j必须分别<3>严格<3>。 3和4是两个维度中数组的大小,不是最大可能的下标。

  

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

也许你正在使用支持这个作为扩展的编译器(想想GCC,Clang等)

答案 1 :(得分:1)

当您使用未初始化的i和j值访问数组a时,

实际上是未定义的行为。否则,如果您正在使用正确计算数组索引(在边界内),那么它是有效的。

您可能正在使用variable length array的gcc扩展名。