将2D数组传递给函数

时间:2013-08-24 15:32:16

标签: 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];
    }
}

但我收到这样的段错误:

 *** Break *** segmentation violation


===========================================================
There was a crash.
This is the entire stack trace of all threads:
===========================================================

4 个答案:

答案 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];
}

}

您应该考虑将数组大小作为参数传递。