首页 > 解决方案 > 是否可以在 cpp 中转换为固定大小的数组?

问题描述

我不知道这是可能的,可能不是 - 但也许

我想要实现的是如下所示,仅针对n大小字符数组:

*(__int64*)(address) = 0x1337;

这适用于 type __int64or __int32orfloat等​​等,我想要做的是

*(char[8]*)(address) = [0x37, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00];

标签: c++arrayspointersassemblychar

解决方案


是否可以在 cpp 中转换为固定大小的数组?

不,不可能在 C++ 中强制转换为数组类型。但是例如,您可以转换为指向数组的指针,我猜这可能是您想要做的。

*(char[8]*)(address)

我想你正试图转换address成一个指向数组的指针。这不是指向数组的指针的正确语法。这是对的:*(char(*)[8])(address)

另一个问题是数组不可分配。您可以做的是分配数组的每个元素。有标准算法可以做这样的循环。在这种情况下,一个简单的解决方案是声明一个包含这些元素的数组,然后从该数组复制到address. 例子:

char* ptr = *static_cast<char(*)[8]>(address);
constexpr std::array data{0x37, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
std::copy(std::begin(data), std::end(data), ptr);

分配数组的一种方法是将它们包装在一个类中,并使用该类的赋值运算符。事实上,std::array上面例子中使用的模板正是这样的包装器。如果您将该类型用于原始数组,那么您可以简单地执行以下操作:

std::array<char, 8> array;
void* address = &array; // imagine that for some reason you are forced to use void*

*static_cast<std::array<char, 8>*>(address)
    = {0x37, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

PS 避免 C 风格的演员表。


推荐阅读