【问题标题】:Getting original char* value from reinterpret_cast从 reinterpret_cast 获取原始 char* 值
【发布时间】:2018-05-25 23:17:00
【问题描述】:

请考虑以下代码:

const char* cTitle = "MyTitle";
__int64 i = reinterpret_cast<__int64>(ctitle);

每次运行此代码时,我都会得到不同的 i 值。 现在我想写一个测试来检查我们是否发送到正确的标题,所以我使用以下代码来实现目标但无法使用reinterpret_cast获取标题:

char* cOrgValue = reinterpret_cast<char*> (i);

是否甚至可以获得原始标题值,如果可以,那么这是正确的方法吗?

编辑

所以让我重新表述一下这个问题: 使用 reinterpret_cast 将 char* 转换为 __int64 后,如何获取其原始值。

【问题讨论】:

  • cTitle 是一个指针;您正在将内存地址转换为__int64。我猜你实际上想“转换”字符串的内容?
  • 每次运行时,包含字符串的数组的位置可能会放在不同的位置。您要解决的实际问题是什么? 为什么您将指针投射到(非标准)__int64 类型? (如果您想打印指针,只需将其转换为void*,或将其存储在std::intptr_t 类型变量中)。
  • @M.M 是的,我想转换字符串的内容。
  • 确实可以做到,而且你所做的已经接近“正确”的做法了。不过,这样做仍然不是一个好主意。而且我们仍然不知道您为什么要这样做。对于您实际上想要通过此解决方案解决的问题,可能会有更好的解决方案。我建议你花点时间read about the XY problem
  • 您的可观察问题是什么?一个好的公式是“我希望/期望这个程序打印 123,但它会打印 456”。

标签: c++ casting reinterpret-cast


【解决方案1】:

Don't use reinterpret_cast。这是我的建议。相反,请致电std::memcpy

const char cTitle[] = "MyTitle";
std::uint64_t i64 = 0;
static_assert(sizeof(cTitle) >= sizeof(i64), "wrong sizes");
std::memcpy(&i64, cTitle, sizeof(i64));

您通过对memcpy 的反向调用获得原始值。

注意:为了让sizeof(cTitle) 成为8(相关部分:读取中chars 的数量),我使用了char 数组而不是char 指针字符串,包括最后的\0)。对于 const char*sizeof(cTitle) 将是 sizeof(void*),这是未指定的。

【讨论】:

  • 这是对您问题的简单回答。但这真的是你想要达到的吗? XY 问题?谁知道?
  • 如果您不知道,那么为什么不将问题关闭为离题或不清楚呢?为什么要写一个开放式问题的答案?
  • @Default 它被称为“试图提供帮助”。即使对OP没有帮助,也许这会对其他人有所帮助
  • 我想知道使用 reinterpret_cast 是否可行,我愿意了解其他可能的方法。
  • 你的断言应该被否定。小心 sizeof,在 OP 示例中,他有一个指针。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2012-05-28
  • 1970-01-01
  • 2021-12-09
  • 2015-09-26
相关资源
最近更新 更多