我有一个看起来像这样的简单结构:
struct Object
{
int x_;
double y_;
};
我正在尝试操作对象的原始数据,这就是我所做的:
int main()
{
Object my_object;
unsigned char* raw_data = reinterpret_cast<unsigned char*>(&my_object);
int x = 10;
memcpy(raw_data, &x, sizeof(x));
raw_data += sizeof(x);
double y = 20.1;
memcpy(raw_data, &y, sizeof(y));
Object* my_object_ptr = reinterpret_cast<Object *>(raw_data);
std::cout << *(my_object_ptr).x << std::endl; //prints 20 (expected 10)
std::cout << *(my_object_ptr).y << std::endl; //prints Rubbish (expected 20.1)
}
我期待上面的代码能工作,,,
真正的问题是什么?这可能吗?
最佳答案
您需要使用 offsetof
macro .还有一些问题,最重要的是你修改了 raw_data
指针,然后将修改后的值转换回 Object*
指针,导致未定义的行为。我选择删除 raw_data
修改(替代方案是不将其强制转换,而是直接检查 my_object
)。这是给你的固定代码,注释中有解释:
#include <iostream>
#include <cstring> // for memcpy
#include <cstddef> // for offsetof macro
struct Object
{
int x_;
double y_;
};
int main()
{
Object my_object;
unsigned char* raw_data = reinterpret_cast<unsigned char*>(&my_object);
int x = 10;
// 1st memcpy fixed to calculate offset of x_ (even though it is probably 0)
memcpy(raw_data + offsetof(Object, x_), &x, sizeof(x));
//raw_data += offsetof(Object, y_); // if used, add offset of y_ instead of sizeof x
double y = 20.1;
// 2nd memcpy fixed to calculate offset of y_ (offset could be 4 or 8, depends on packing, sizeof int, etc)
memcpy(raw_data + offsetof(Object, y_), &y, sizeof(y));
// cast back to Object* pointer
Object* my_object_ptr = reinterpret_cast<Object *>(raw_data);
std::cout << my_object_ptr->x_ << std::endl; //prints 10
std::cout << my_object_ptr->y_ << std::endl; //prints 20.1
}
关于C++ 操作结构的原始数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24962307/