0

2 つの 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];
    }
}

しかし、次のような segfault エラーが発生します。

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

書かれているように、操作の順序が原因で、正しい順序で配列を逆参照していません。によって行われた逆参照[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

配列添字は演算子よりも優先順位が高いため、最初にポインターを逆参照して 2D 配列を取得する*には、括弧を含める必要があります。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 に答える