首页 > 解决方案 > 读取内存的特定地址并将其解释为所需的类型

问题描述

假设我有一个数组float someArray[10],女巫我已经为其所有元素分配了值。我知道 someArray 分配了 40 个字节的内存,因为每个浮点数都有 4 个字节。

现在我想用two bytebytwo byte从头开始​​读取这 40 个字节的内存并将它们解释为 unit16_t 所以我将拥有unit16_t intArray[20]. 我不想用union

我也阅读了这些问题,但没有帮助:

读记忆 重新解释

标签: c++

解决方案


这是非常棘手的,非常低级的东西。你绝对确定你不能以任何其他方式解决这个问题吗?你有考虑字节序吗?你是?你有?好的。

C++ 不允许您在内存中获取一个连续区域并将其解释为您想要的任何内容。几乎唯一允许您做的事情是将指向属于单个数组的连续内存块的开头的指针解释为 a char*unsigned char*或者从 C++17 开始std::byte*(参见严格的别名规则,第 [basic. lval] 在标准中,对于 C++17,它是 § 6.10 (8))。本质上,这意味着您可以将数组解释为字节序列。就是这样,但它足以复制内存。这就是您在不相关类型之间进行转换的方式。

使用 C 风格的数组(它们容易出错,所以尽可能避免):

#include <cstddef>
#include <cstdint>
#include <cstring>

int main()
{
    constexpr std::size_t item_count = 10;

    float float_array[item_count] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::uint16_t int_array[item_count * (sizeof(float) / sizeof(uint16_t))];

    std::memcpy(
            reinterpret_cast<char*>(int_array),
            reinterpret_cast<char*>(float_array),
            item_count * sizeof(float));
}

或与std::array

#include <array>
#include <cstddef>
#include <cstdint>
#include <cstring>

int main()
{
    std::array<float, 10> float_array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    std::array<std::uint16_t, float_array.size() * (sizeof(float) / sizeof(uint16_t))> int_array;

    std::memcpy(
            reinterpret_cast<char*>(int_array.data()),
            reinterpret_cast<char*>(float_array.data()),
            float_array.size() * sizeof(float));
}

推荐阅读