我想将一维数组指针和二维数组指针放在一个联合中,这样我就可以以任何方式访问数据。在以下程序中,我希望通过两种方式打印出值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;
答案 0 :(得分:5)
首先,您要调用 undefined-behavior 。
标准说你只能从你上次写过的工会成员那里读书,因此不允许互换地阅读array2D
和array1D
(即使它经常在实践中有效) 不推荐)。
二;使用array1D
您尝试取消引用并读取当前地址(因为 UB 而因为 UB 而被分配给new int*[1]
的地址)的值, array2D[0][0]
的值位于路径的另一步。
要访问a.array1D
期望的值,您需要以下内容(不推荐)
**reinterpret_cast<int**> (a.array1D);
答案 1 :(得分:2)
使用new
分配多维数组时,实际上就是分配多个数组。
第一个是指向数组的指针数组。因此,a.array1D[0]
实际上包含指向数组指针的指针,并且您正在打印指针的值。
我很确定你是否会这样做:
cout << (int*)a.array1D[0] << endl;
你会得到同样的:
cout << a.array2D[0] << endl;
答案 2 :(得分:2)
打印时,a.array2D
的值指向数组的开头。由于您使用的是联合array1D
和array2D
占用相同的空格并且包含相同的值。
当您访问a.array1D[0]
中的指针值时,您告诉它获取array1D
的第一个元素。因为您使用的是union
,所以这也指向array2D
的第一个元素,它恰好是一个指针。