繁体   English   中英

将2D数组传递给函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM