2013-12-18 4 views
1

Я пытаюсь использовать следующий код для многомерного массива. Это дает SEG ошибка Я не знаю, в чем проблема.reinterpret_cast <double**> SEG fault

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

Есть ли reinterpret_cast в C ? –

+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), который имеет совершенно разную структуру памяти. См. this и this Вопрос.

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 (double (* arr) []) {...} Я пробовал, но у меня есть ошибка компиляции. Он не работает. Благодарим за помощь. – user2990971