将2D数组传递给函数

JMz*_*nce 0 c++ arrays pointers

我试图将两个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];
    }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这样的段错误:

 *** Break *** segmentation violation


===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================
Run Code Online (Sandbox Code Playgroud)

Cor*_*lks 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];
Run Code Online (Sandbox Code Playgroud)

在编写时,由于操作顺序,您不会以正确的顺序取消引用阵列.[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];
    }
}
Run Code Online (Sandbox Code Playgroud)

甚至比这更好:

std::copy_n(*Array1, 32, *Array2);
Run Code Online (Sandbox Code Playgroud)

编辑:虽然std::copy_n如果您在复制时更改某些元素的顺序,但对您来说并不适用.