2017-03-27 134 views
0

在當ARR被傳遞到如下面轉置函數和檢查的內容作爲一個[0],它給0×00 ...... 001下面的代碼而在原檢查地址爲arr,爲什麼是這樣以及怎麼回事?我期望[0]是數組中的地址1,而[0] [1]是數組的第一個元素。請解釋。C++ 2D陣列和指針引用

問題:

int arr[][4] = { { 1, 2, 3, 4},{ 5, 6,7,8 },{ 9,10,11,12 } }; 
    transpose((int **)arr, 3, 4); 
    int** transpose(int** a, int m, int n) 
    { 
     int** output = new int*[n]; 
     for (int i = 0;i < m;i++) 
     { 
      output[i] = new int[n]; 
     } 
     for (int i = 0;i < m;i++) 
     { 
      for (int j = 0;j < n;j++) 
      { 
       //*((output[j]) + i) = *(a[i] + j); 
       //*((output[j]) + i) = a[i][j]; 
       output[j][i] = a[i][j]; 
      } 
     } 
     return output; 
    } 

拋出異常。

正常工作:

int** output=transpose((int *)arr, 3, 4); 
    print(output,3,4); 
    int**transpose(int * a, int m, int n) 
    { 
     int** t = new int*[n]; 
     for (int i = 0;i < n;i++) 
     { 
      t[i] = new int[m]; 
     } 
     for (int i = 0;i < m;i++) 
     { 
      for (int j = 0;j < n;j++) 
      { 
       t[j][i] = *((a + i*n) + j); 
      } 
     } 
     return t; 
    } 

    void Matrix::print(int ** a, int m, int n) 
    { 
     for (int i = 0;i < m;i++) 
     { 
      for (int j = 0;j < n;j++) 
      { 
       std::cout << a[i][j] << ","; 
      } 
      std::cout << "\n"; 
     } 
    } 
+0

我不確定你明白「拋出異常」是什麼意思。 –

+0

在第一種方法中訪問[i] [j]時拋出訪問衝突異常。它告訴無法讀取內存。 – Curious

+1

'(int **)arr'是一個錯誤。你似乎不理解數組和指針之間的區別。轉置函數不能用於二維數組。 –

回答

1

爲了使您的代碼與2維數組一起工作,應該修改代碼,如下所示。

int arr[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; 
transpose(&arr, 3, 4); 

int** transpose(int(*a)[3][4], int m, int n) 
{ 
    int** output = new int*[n]; 
    for (int i = 0; i < m; i++) 
    { 
     output[i] = new int[n]; 
    } 
    for (int i = 0; i < m; i++) 
    { 
     for (int j = 0; j < n; j++) 
     { 
      //*((output[j]) + i) = *(a[i] + j); 
      //*((output[j]) + i) = a[i][j]; 
      if (i < n && j < m) 
      { 
       output[j][i] = (*a)[i][j]; 
      } 
     } 
    } 
    return output; 

看那參數聲明int(*a)[3][4]。它表示變量a是指向大小爲[3] [4]的二維數組的指針。額外的檢查if (i < n && j < m)可確保數組訪問不會超出界限。

它會毫無例外的工作!

0

首先,在你的例子是3 ñ是4,所以在轉功能,您與創建輸出ñ(4)指針,但你有for循環從0到m(3),所以此時輸出已經有未初始化的元素(輸出[3])。它崩潰的原因是您在下一個循環中使用未初始化的元素。

+0

在第一種方法中訪問[i] [j]時拋出訪問衝突異常。它告訴無法讀取內存。 – Curious