2

1 次元配列ポインターと 2 次元配列ポインターの両方を共用体に入れたいので、どちらの方法でもデータにアクセスできます。9次のプログラムでは、値が両方の方法で出力されることを確認したいと思います。

#include <iostream>
class A {
public:
    union {
        int** array2D;
        int*  array1D;
    };
    A() {
        array2D = new int*[1];
        array2D[0] = new int[1];
    }
};

int main() {
    A a;
    a.array2D[0][0] = 9;
    cout << a.array2D[0][0] << endl;
    cout << a.array1D[0]    << endl;
    cout << a.array2D << endl;
    cout << a.array1D << endl;
}

実際の出力:

9
146989080
0x8c2e008 //Pointer address of array2D
0x8c2e008 //Pointer address of array1D

アドレスは同一であり、定義により、多次元配列は 1 次元配列と同じ方法で格納されます。なぜ 2 つcoutの s が異なる結果を出力するのだろうか? 私は何を取りこぼしたか?

編集:以下の回答のおかげで、私が見逃したものを見ることができます。array1D からデータにアクセスするための修正は次のとおりです。

cout << *( (int*) a.array1D[0]) << endl;

4

3 に答える 3

5

まず、undefined-behaviorを呼び出しています。

標準では、最後に書いたユニオンのメンバーからのみ読み取ることが許可されているため、読み取りarray2Darray1D交換可能性は許可されていません (実際には頻繁に機能しますが、推奨されません)。

2番; を使用して、現在(おそらくUBのために) a に割り当てられているarray1Dアドレスの値を逆参照して読み取ろうとしている場合、 の値はパスのさらに 1 ステップ下にあります。new int*[1]array2D[0][0]


期待する値にアクセスするにはa.array1D、以下のようなものが必要です (推奨されません)。

**reinterpret_cast<int**> (a.array1D);
于 2013-04-23T06:16:22.177 に答える
2

を使用して多次元配列を割り当てるnewと、実際には多数の配列が割り当てられます。最初のものは、配列へのポインターの配列です。したがって、a.array1D[0]実際には配列へのポインターへのポインターが含まれており、ポインターの値を出力しています。

あなたが次のことをするなら、私はかなり確信しています:

cout << (int*)a.array1D[0] << endl;

あなたは次のようになります:

cout << a.array2D[0] << endl;
于 2013-04-23T06:13:22.953 に答える
2

の値を出力するa.array2Dと、配列の先頭を指します。ユニオンを使用しているため、同じスペースarray1Darray2D占有し、同じ値が含まれます。

のポインター値にアクセスするa.array1D[0]と、 の最初の要素を取得するように指示されますarray1D。thisを使用しているため、たまたまポインターunionである最初の要素も指しています。array2D

于 2013-04-23T06:17:00.110 に答える