0

我正在尝试将两个二维数组(大小相同;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:
===========================================================
4

4 回答 4

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];

正如它所写的那样,由于操作的顺序,您没有以正确的顺序取消引用数组。by 完成的取消引用[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如果您在进行复制时更改某些元素的顺序,但实际上并不适合您。

于 2013-08-24T15:37:13.347 回答
3

你应该做

(*Array2)[i][0] = (*Array1)[i][0];

代替

*Array2[i][0] = *Array1[i][0];

由于索引运算符具有更高的优先级

于 2013-08-24T15:36:46.500 回答
2

数组下标的优先级高于*运算符,因此您需要包含括号才能首先取消引用Array2指针以获取二维数组:

    (*Array2)[i][0] = (*Array1)[i][0];

http://en.cppreference.com/w/cpp/language/operator_precedence

于 2013-08-24T15:36:18.570 回答
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];
}

}

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

于 2013-08-24T15:38:28.807 回答