reinterpret_cast <double **> SEG fault </double **>

时间:2013-12-18 11:36:42

标签: c++ multidimensional-array pointers

我正在尝试以下代码用于多维数组。它会出现SEG错误 我不知道这是什么问题。

 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) ) ;
}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:5)

您正在使用2D array,其存储方式与线性数组相同(维度仅用于索引),但您解释的是pointer to (array of) pointer(s) to (array of) double(s),它具有完全不同的内存布局。请参阅thisthis SO问题。

答案 1 :(得分: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);