2013-12-18 81 views
1

我想下面的代碼爲多維數組。它給SEG錯誤 我不知道這是什麼問題。reinterpret_cast <double**>賽格故障

static void read(double **arr){ 
    //REQ arr to be pointing to array[5][4] 
    //EFF prompt the use to input the data 
    //Mod array pointer by **arr 
     int i(0) , j(0); 
     double tmp ; 


     for(i=0 ; i<4 ; i++){ 

      for(j=0 ; j<5 ; j++) { 
       cout <<"Please enter Data#"<< (j+1) << " File#" << (i+1) <<" "<<flush; 

       cin >> tmp ; 
       arr[j][i] = tmp ; 
      } 

     } 

     return ; 
    } 


int main(){ 
double arr[5][4] ; 
read(reinterpret_cast<double**>(arr)) ; 
} 

我在做什麼錯在這裏?

+0

是否有任何C的reinterpret_cast ? – 2013-12-18 11:39:51

+0

@NishithJainMR這不是C.我不知道他爲什麼使用這個標籤。 – 0x499602D2

+0

C++中的數組沒有實現爲指向指針的指針。它被實現爲連續的記憶部分。所以'arr [2] [3]'更可能相當於'arr + 2 *(sizeof(int)* 4)+ 3 * sizeof(int)' –

回答

5

您正在使用2D array,它以與線性陣列相同的方式存儲(尺寸僅用於索引),但是您正在解釋的是pointer to (array of) pointer(s) to (array of) double(s),它具有完全不同的存儲器佈局。請參閱thisthis SO問題。

3

數組的數組是而不是與指向指針的指針相同。

讓我們看看它們是如何在存儲器佈局:

陣列的陣列:

 
+-----------+-----------+-----+-----------+-----------+-----+-----------+ 
| arr[0][0] | arr[0][1] | ... | arr[0][3] | arr[1][0] | ... | arr[4][3] | 
+-----------+-----------+-----+-----------+-----------+-----+-----------+ 

比較到指針到指針(例如double** arr):

 
+-----+  +--------+--------+-----+ 
| arr | ---> | arr[0] | arr[1] | ... | 
+-----+  +--------+--------+-----+ 
       |  | 
       |  `------. 
       |    | 
       v    v 
      +-----------+ +-----------+ 
      | arr[0][0] | | arr[0][1] | 
      +-----------+ +-----------+ 

解決方案是更改您的功能,以便它可以使用一組數組:

void read(double arr[][4]) { ... } 

或指向數組(這工作,因爲數組衰變爲指針):

void read(double (*arr)[]) { ... } 

那麼你可以傳遞數組沒有鑄造:

double arr[5][4]; 
read(arr); 
+0

非常有幫助,非常感謝你 – user2990971

+0

void read雙(* ARR)[]){...} 我試過了,但我有編譯錯誤。它不起作用 謝謝你的幫助 – user2990971