2012-09-09 40 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