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

地址是相同的,根据定义,多维数组的存储方式与一维数组的存储方式相同。我想知道为什么两者cout打印出不同的结果?我错过了什么?

编辑:感谢下面的答案,我可以看到我错过了什么。从 array1D 访问数据的修复方法是:

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

4

3 回答 3

5

首先,您正在调用undefined-behavior

该标准规定,您只能从您上次编写的工会成员中阅读 t,因此不允许阅读array2Darray1D互换(即使它在实践中经常有效,但推荐)。

第二; 使用array1D您正在尝试取消引用并读取当前已分配给 a 的地址处的值(可能是因为 UB )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

当您打印出 is 的值时,a.array2D它指向数组的开头。由于您同时使用联合array1Darray2D占用相同的空间并将包含相同的值。

当您访问指针值时,a.array1D[0]您是在告诉它获取array1D. 因为您使用的是this 也指向恰好是指针union的第一个元素。array2D

于 2013-04-23T06:17:00.110 回答