让我们假设一些错误的代码将一个 int 值放入浮点地址。一般来说,我怎样才能找回那个 int 值?
问问题
109 次
2 回答
2
关于这个答案的注意事项:下面的代码使用 模拟问题(将 a 存储int
在为 a 保留的内存位置float
)reinterpret_cast
,然后reinterpret_cast
再次使用解决问题。这打破了严格别名规则(3.10/10 C++ 标准),该规则指出通过与对象的真实类型不匹配的类型的 (g) 左值访问对象(在某种意义上匹配),调用未定义的行为。
出于这个原因,不应使用下面给出的代码,并且解决方案,即使用reinterpret_cast
,至少是危险的(尽管它可能经常工作)。请参阅Steve Jessop 的答案以获得正确的解决方案。感谢他指出我的错误(见评论)。
原始答案:
如果您有存储值的地址,并且地址正确对齐以进行整数访问,则应该可以使用reinterpret_cast
:
int main()
{
/* An integer and an uninitialized float: */
int original = 45;
alignas(int) alignas(float) float f;
float *p = &f;
/* "Erroneously" putting an int into the address of the float: */
*reinterpret_cast<int*>(p) = original;
/* Retrieving the int (this is what you were looking for): */
int retrieved = *reinterpret_cast<int*>(p);
std::cout << "Original: " << original
<< ", Stored float: " << f
<< ", Retrieved: " << retrieved
<< std::endl;
return 0;
}
(上面使用的关键字alignas
来自 C++11。你的编译器可能不接受它。无论如何,这部分代码是我模拟问题的方式,它不是解决方案的重要部分。)
于 2013-01-24T06:52:23.467 回答
1
答案reinterpret_cast<int*>
违反了严格的别名并且具有未定义的行为。
如果你想用定义的行为来做:
int read_int_from_float(const float &f) {
int result;
std::memcpy(&result, &f, sizeof(result));
return result;
}
这是在检查之后float
并int
具有相同的大小。它们不需要具有相同的对齐方式。
于 2013-01-24T09:12:52.387 回答