我想将一维数组指针和二维数组指针放在一个 union 中,这样我就可以通过任何一种方式访问数据。在下面的程序中,我想查看值 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 的 union 成员中读取,因此不允许互换读取 array2D
和 array1D
(即使虽然它在实践中经常有效,但不推荐)。
第二个;使用 array1D
您正在尝试取消引用并读取当前分配给 的地址处的值(应该是 因为 UB) new int*[1]
,array2D[0][0]
的值位于路径的下一级。
要访问您期望从 a.array1D
获得的值,您需要以下内容(不推荐)
**reinterpret_cast<int**> (a.array1D);
关于c++ - 如何在 union 中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162176/