我正在尝试以下代码用于多维数组。它会出现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) ) ;
}
我在这里做错了什么?
答案 0 :(得分:5)
您正在使用2D array
,其存储方式与线性数组相同(维度仅用于索引),但您解释的是pointer to (array of) pointer(s) to (array of) double(s)
,它具有完全不同的内存布局。请参阅this和this 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);