-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++ コンパイラによると、次は正しいですか?

はい、標準では、複数の次元を持つ配列であってもメモリ内で連続していると指定されているためです。しかし!配列のインデックス付けと長さを少し誤解しています.iとjは、それぞれ厳密に3と4未満でなければなりません。3 と 4 は、配列の 2 次元のサイズであり、可能な添字の最大数ではありません。

配列の境界が厳密に定数式でなければならない場合、次のコードでコンパイル エラーが発生しないのはなぜですか?

これを拡張機能としてサポートするコンパイラを使用している可能性があります (GCC、Clang などを考えてください)。

于 2012-09-09T09:31:17.927 に答える
1

i と j の初期化されていない値を使用して配列にアクセスすると、実際には未定義の動作になります。aそれ以外の場合、配列インデックスを正しく (境界内で) 計算している場合、それは有効です。

あなたの場合、可変長配列にgcc 拡張機能を使用している可能性があります。

于 2012-09-09T09:36:47.867 に答える