c++ - 如何在 union 中使用指针

标签 c++ c

我想将一维数组指针和二维数组指针放在一个 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 成员中读取,因此不允许互换读取 array2Darray1D (即使虽然它在实践中经常有效,但推荐)。

第二个;使用 array1D 您正在尝试取消引用并读取当前分配给 的地址处的值(应该是 因为 UB) new int*[1]array2D[0][0] 的值位于路径的下一级。


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

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

关于c++ - 如何在 union 中使用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16162176/

相关文章:

c++ - 如何在 C++ 中通过引用传递 vector 元素?

c++ - 使用 OpenSSL 库在 C++ 中生成 SHA 哈希

c - 如何从 fgets 中检测空字符串

c - 如何将 int 的各个单元存储在 int 数组中; C语言

c++ - 取消分配(并调用其析构函数)模板参数

c++ - OOP 是否鼓励良好的缓存,从而获得良好的性能?

c++ - 在 64 位 Linux 上强制内存分配从较高地址 (>4GB) 分配

c++ - 内存泄漏检测器工作原理

C:向动态分配的数组添加元素

c - 为什么这段代码通常可以运行但有时会产生Segmentation Fault?