我如何找到一个字符串的内存地址

How do I find the memory address of a string?

本文关键字:字符串 一个 内存 地址 何找      更新时间:2023-10-16

我有一个思维障碍,我知道我应该知道这一点,但我需要一点帮助。

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

    string word = "Hello";

如何找到"Hello"的内存地址?

编辑:这就是我想做的…

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

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

使用:

  • std::string::data()如果你的数据不是像。

  • std::string::c_str()如果你想要的数据,并保证得到null终止。

注意,这两个调用返回的指针并不一定是std::string对象正在操作的底层数据。

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

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

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

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

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方法的begin/end兼容容器。因此,例如,如果您决定使用QString (QT使用的字符串)或AWS:: string或std::vector来保存字符,则c_str()方法不起作用,但上面的方法可以。

b)可能不像c_str()那样昂贵…一般来说,应该实现类似于我在第二行代码中获得地址的调用,但不能保证以这种方式实现(例如,如果您使用的字符串不是null终止,它可能需要重新分配和整个字符串的突变,以便添加null终止符……这会突然使它变得线程不安全并且开销很大,std::string不是这种情况,但可能是其他类型的字符串)

c)它更好地传达了意图,最终你想要的是一个地址,而第一批代码恰恰表达了这一点。

所以我认为这种方法更适合:

清晰、兼容、高效。

编辑:

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

声明一个指向变量的指针,然后按照自己的方式查看它

相关文章: