-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
    }
    
4

2 回答 2

2

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

是的,因为标准规定即使超过 1 维的数组在内存中也是连续的。但!您有点误解了数组索引和长度 - i 和 j 必须分别严格小于3 和 4。3 和 4 是数组在其二维中的大小,而不是最大可能的下标。

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

也许您正在使用支持此扩展的编译器(想想 GCC、Clang 等)

于 2012-09-09T09:31:17.927 回答
1

当您使用未初始化的 i 和 j 值访问数组时,这实际上是未定义的行为。a否则,如果您正确使用计算数组索引(在范围内),那么它是有效的。

在您的情况下,您可能正在对可变长度数组使用 gcc 扩展。

于 2012-09-09T09:36:47.867 回答