[英]Passing 2D arrays to a function
我正在尝试将两个2D数组(大小相同; 8 x 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:
===========================================================
你要:
(*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
如果您在执行复制时更改某些元素的顺序,则对您实际上不起作用。
你应该在做
(*Array2)[i][0] = (*Array1)[i][0];
代替
*Array2[i][0] = *Array1[i][0];
由于索引运算符具有更高的优先级
数组下标的优先级高于*
运算符,因此您需要包括括号才能首先取消引用Array2
指针以获得2D数组:
(*Array2)[i][0] = (*Array1)[i][0];
http://en.cppreference.com/w/cpp/language/operator_precedence
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];
}
}
您可能应该考虑将数组大小作为参数传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.