【问题标题】:How do I find the memory address of a string?如何找到字符串的内存地址?
【发布时间】:2023-03-21 18:10:01
【问题描述】:

我有精神障碍,我知道我应该知道这一点,但我需要一点帮助。

如果我这样声明一个字符串变量:

    string word = "Hello";

如何找到“Hello”的内存地址?

编辑:这就是我想要做的......

编写一个函数,它接受一个参数,一个字符串的地址,并打印该字符串一次。 (注意:您需要使用指针来完成此部分。)

但是,如果提供了第二个参数类型 int 且非零,则该函数应打印字符串的次数等于该函数在该点被调用的次数。 (注意,字符串被打印的次数不等于第二个参数的值;它等于该函数到目前为止被调用的次数。)

【问题讨论】:

    标签: c++ string memory-address


    【解决方案1】:

    使用任一:

    请注意,这些调用返回的指针不一定必须是 std::string 对象正在操作的基础数据。

    【讨论】:

    • 另请注意,在 c++0x 下,这些函数根据定义返回相同的东西(需要 not 随着时间的推移保持相同)
    • @sehe “随着时间的推移不需要相同”你是什么意思?
    • @pooya13 我的意思是std::string 可以重新分配使c_str()data() 返回不同的值
    【解决方案2】:

    取第一个字符的地址是通常的做法。 &word[0]。但是,如果您不使用遗留代码进行操作,则需要这样做通常表明您做错了。

    【讨论】:

    • 值得注意的是,这不会返回 const 指针,这与 c_str() 不同。如果你需要一个非常量的 ptr,那就更糟糕的代码味道了 :-(
    • 如果word.length() == 0,这是未定义的行为吗?我是 C++ 的新手。
    【解决方案3】:

    我猜你想要一个指向普通旧 C 字符串的指针?然后使用word.c_str()。请注意,这并不能保证指向字符串的内部存储,它只是您可以使用的(常量)C 字符串版本。

    【讨论】:

      【解决方案4】:

      您可以使用c_str() 函数获取指向C 字符串的指针(const char *);但是请注意,只要您修改字符串,指针就会失效;您必须再次调用c_str(),因为旧字符串可能已被释放。

      【讨论】:

        【解决方案5】:

        好的,所以,我知道这个问题很老,但我觉得这里的明显答案实际上是:

        std::string your_string{"Hello"};
        
        //Take the address of the beginning
        auto start_address = &(*your_string.begin())
        
        //Take the address at the end
        auto end_address = &(*your_string.end())
        

        本质上,这将完成与使用相同的事情:

        auto start_address = your_string.c_str();
        
        auto end_address = your_string.c_str() + strlen(your_string.c_str());
        

        但是我更喜欢第一种方法(获取取消引用的迭代器的地址),因为:

        a) 保证可以使用可能没有 c_str 方法的开始/结束兼容容器。因此,例如,如果您决定想要一个 QString(QT 使用的字符串)或 AWS::String 或 std::vector 来保存您的字符,则 c_str() 方法不起作用,但上面的方法会起作用。

        b) 可能不如 c_str()...如果您使用的字符串不是空终止的,则可能需要重新分配和更改整个字符串以添加空终止符......这会突然使其线程不安全且非常昂贵,std 不是这种情况: :string 但可能适用于其他类型的字符串)

        所以我想说这种方法更适合:

        清晰度、兼容性和效率。

        编辑:

        请注意,无论使用哪种方法,如果您在获取地址后更改初始字符串,则地址将无效(因为字符串可能会被重新定位)。编译器不会对此发出警告,它可能会导致一些非常讨厌的错误:/

        【讨论】:

          【解决方案6】:

          声明一个指向变量的指针,然后查看它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-18
            • 1970-01-01
            • 2013-12-25
            • 2016-09-20
            • 2012-04-22
            • 2013-08-10
            相关资源
            最近更新 更多