我想将一维数组指针和二维数组指针都放在一个联合中,因此我可以用任何一种方式访问​​数据。在以下程序中,我希望看到两种方法都打印出了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

这些地址是相同的,并且按照定义,多维数组的存储方式与一维数组的存储方式相同。我想知道为什么两个cout可以打印出不同的结果?我错过了什么?

编辑:
感谢下面的答案,我可以看到我错过的内容。
从array1D访问数据的解决方法是:
cout << *( (int*) a.array1D[0]) << endl;

最佳答案

首先,您要调用未定义行为。

该标准说,只允许您从上次写t的工会成员中读取,因此不允许交替读取array2Darray1D(即使通常在实践中它是,但不建议)。

第二;使用array1D,您尝试取消引用并读取当前已分配给new int*[1]的地址(可能是由于UB)的值,array2D[0][0]的值位于路径的下一级。

要访问a.array1D中期望的值,您将需要以下内容(不推荐)

**reinterpret_cast<int**> (a.array1D);

09-26 06:43