【问题标题】:How to get the memory adresses from a string?如何从字符串中获取内存地址?
【发布时间】:2017-01-18 00:52:22
【问题描述】:

我有一个非常基本的问题,但我无法理解。 我想知道如何检索字符串中每个字符的内存地址。

例如:

    string str("Test");
    cout << size(str) << endl; 

我知道这会返回这个 4,因为这个字符串是 4 个字节,但是我如何在屏幕上输出每个字节的内存地址?

我试过了

string s = "abcd";
string::iterator pos;

for (pos = s.begin(); pos != s.end(); ++pos) {
      cout << &pos << endl;
}

cin.get();
return 0;

但这是输出:

00AFFB8C
00AFFB8C
00AFFB8C
00AFFB8C

但它不需要类似于:

00AFFB8C
00AFFB8D
00AFFB8E
00AFFB8F

那么有人知道我在这里做错了什么吗?

【问题讨论】:

  • 您看到相同的地址,因为它们存储在同一个地方。
  • 哦,错了。 size(str) 返回std::string 对象的大小,而不是std::string 中文本的大小。尝试std::string::length() 获取字符串的长度。
  • @ThomasMatthews - std::size(c) 返回c.size()。你好像在想sizeof
  • &pos 是迭代器的地址,在栈上声明。 ++pos,不增加其地址。

标签: c++ string for-loop memory iterator


【解决方案1】:

错的太多了。

正如我在评论中所说,sizeof(str) 返回的是 std::string 对象的大小,而不是对象内的文本。 std::string 对象可以是任意长度(不包括文本,可能存储在对象之外)。

std::string::iterator 是一个迭代器对象。您不断打印 迭代器 的地址或位置,而不是迭代器指向的内容。

如果您想要std::string 对象中文本的位置,请查找std::string::data() 方法。

【讨论】:

  • 代码没有使用sizeof;它使用std::size(str),返回str.size()
  • @PeteBecker:std::size 是什么时候引入的? (谢谢)
  • @ThomasMatthews C++17.
  • @ThomasMatthews - 明年。
【解决方案2】:

只需将循环更改为:

for (pos = s.begin(); pos != s.end(); ++pos) {
      cout << static_cast<void*>( &*pos ) << endl;
}

static_cast 是必需的,因为 &amp;*pos 的类型为 char *,而 std::ostream 打印的方式不是您想要的。

【讨论】:

    【解决方案3】:

    您看到的是相同的地址,因为您打印的是 iterator 的地址,而不是字符的地址。

    将您的代码更改为:

    for (pos = s.begin(); pos != s.end(); ++pos) {
          cout << static_cast<void*>(&(*pos)) << endl;
    }
    

    这将给出不同的地址,例如在我的机器上:

    0x7fff5a7a09cf
    0x7fff5a7a09d0
    0x7fff5a7a09d1
    0x7fff5a7a09d2
    

    【讨论】:

    • -1 字符没有存储在同一个地址。如果字符存储在同一个地址,您只会看到最后一个。
    • 迭代器的地址没有变化。 OP 正在打印迭代器的地址,它不会改变;迭代器的内容是变化的。
    • 是的,我在您发布答案时发现...现在看来我复制了您@ThomasMatthews,我有-2,所以我想我应该删除它...但是+1也感谢你找到它! :)
    猜你喜欢
    • 2017-08-30
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 2019-07-21
    • 2012-07-05
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多