【问题标题】:How to convert pointer value obtained via reference operator to string?如何将通过引用运算符获得的指针值转换为字符串?
【发布时间】:2013-04-09 07:25:27
【问题描述】:

我是 C++ 的初学者。我正在做这个需要跟踪内存地址的项目。不幸的是,这个跟踪函数有以下原型声明:

void TRC(uint8_t, uint8_t, uint8_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, const char*)

现在可供我选择的选项是:

  1. 将此内存地址(指针值)转换为uint64_t类型。但我在某处读到不建议这样做,因为引用运算符返回的指针值取决于平台,将指针转换为整数可能会返回错误值。

  2. 将此内存地址转换为字符串并通过最后一个参数传递。在 Python 中,这很简单,因为我们有 str() 函数。我们在 C++ 中也有类似的东西吗?

如果我在这里推断出我的方法/理解有问题,请告诉我。

【问题讨论】:

  • 内存地址不是“十六进制”。它们只是数字,当您打印出来时会转换为十六进制(可能)。如果您想打印地址的数值,那么您别无选择,只能在某个时候将其转换为整数。当然,该值将取决于平台,所有内存地址都是。我会选择选项 1。
  • 我认为您对数字的呈现方式以及它们在计算机中的存储方式感到困惑。所有数字都以二进制形式存储在计算机上,但可以以多种表示形式表示,包括十进制和十六进制。
  • Joachim,我指的是通过引用运算符获得的指针值。我将编辑这个问题的标题。约翰,你将如何将这个十六进制值转换为 uint64_t?
  • @previous 评论者:数字既不是十六进制也不是二进制,您也不会“将数字转换为十六进制”。只有数字的表示形式可以是二进制、十六进制、罗马数字等。
  • 此外,地址本身是实现定义的(或者我记得在阅读标准时有点惊讶)。您始终可以使用经过标准批准的机制,例如 intptr_tuintptr_t(如果您的实现提供)。

标签: c++ string pointers type-conversion


【解决方案1】:

如果不需要快速代码,您可以使用流进行转换。

    #include <sstream>
    #include <iomanip>

...
    std::ostringstream os;
    os << std::hex << static_cast<void*>(my_pointer);
    TRC(..., os.str().c_str());

【讨论】:

    【解决方案2】:

    你是对的,指针不应该作为任何整数类型存储或传递。

    如果要将指针转换为可打印的十六进制字符串,可以使用例如std::ostringstream:

    std::ostringstream os;
    
    os << std::hex << static_cast<void*>(some_pointer);
    
    std::string str = os.str();
    TRC(...,  str.c_str());
    

    【讨论】:

    • 大多数 STL 实现没有从 std::string 到 const char* 的隐式转换。
    • 为什么是reinterpret_cast?为什么不static_cast
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多