我正在尝试将两个2D数组(两个相同的大小; 8乘4)传递给一个函数,并设置一个等于另一个(一些元素的顺序不同,但这并不重要)。到目前为止,我有:
int main() {
double** Array1;
double** Array1;
// MALLOC BOTH OF THEM
....
// PUT STUFF IN ARRAY1
....
CopyFunction(&Array1, &Array2);
}
void CopyFunction(double*** Array1, double*** Array2) {
for (int i = 0; i < 8; i++) {
*Array2[i][0] = *Array1[i][0];
*Array2[i][1] = *Array1[i][1];
*Array2[i][2] = *Array1[i][2];
*Array2[i][3] = *Array1[i][3];
}
}
但我收到这样的段错误:
*** Break *** segmentation violation
===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
答案 0 :(得分:5)
你想:
(*Array2)[i][0] = (*Array1)[i][0];
(*Array2)[i][1] = (*Array1)[i][1];
(*Array2)[i][2] = (*Array1)[i][2];
(*Array2)[i][3] = (*Array1)[i][3];
如上所述,由于操作顺序,您不会以正确的顺序取消引用数组。由[i][N]
完成的解除引用发生在*
之前。原始版本与执行*(*(*(Array1 + i) + N))
相同(由于[]
的实际工作方式),但您想要的是*(*(*Array1 + i) + N)
,这就是为什么您必须像我一样添加括号
然而,更好的是:
void CopyFunction(double** Array1, double** Array2) {
for (int i = 0; i < 8; i++) {
Array2[i][0] = Array1[i][0];
Array2[i][1] = Array1[i][1];
Array2[i][2] = Array1[i][2];
Array2[i][3] = Array1[i][3];
}
}
甚至比这更好:
std::copy_n(*Array1, 32, *Array2);
编辑:如果您在复制时更改某些元素的顺序,std::copy_n
对您不起作用。
答案 1 :(得分:3)
你应该这样做
(*Array2)[i][0] = (*Array1)[i][0];
而不是
*Array2[i][0] = *Array1[i][0];
因为索引运算符具有更高的优先级
答案 2 :(得分:2)
数组下标的优先级高于*
运算符,因此您需要包括括号,以便首先取消引用Array2
指针以获取2D数组:
(*Array2)[i][0] = (*Array1)[i][0];
http://en.cppreference.com/w/cpp/language/operator_precedence
答案 3 :(得分:1)
int main() {
double** Array1;
double** Array1;
// MALLOC BOTH OF THEM
....
// PUT STUFF IN ARRAY1
....
CopyFunction(Array1, Array2);
}
void CopyFunction(double** Array1, double** Array2) {
for (int i = 0; i < 8; i++) {
Array2[i][0] = Array1[i][0];
Array2[i][1] = Array1[i][1];
Array2[i][2] = Array1[i][2];
Array2[i][3] = Array1[i][3];
}
}
您应该考虑将数组大小作为参数传递。