-3

让我们假设一些错误的代码将一个 int 值放入浮点地址。一般来说,我怎样才能找回那个 int 值?

4

2 回答 2

2

关于这个答案的注意事项:下面的代码使用 模拟问题(将 a 存储int在为 a 保留的内存位置floatreinterpret_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;
}

这是在检查之后floatint具有相同的大小。它们不需要具有相同的对齐方式。

于 2013-01-24T09:12:52.387 回答