繁体   English   中英

如何找到字符串的 memory 地址?

[英]How do I find the memory address of a string?

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

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

    string word = "Hello";

如何找到“Hello”的memory地址?

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

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

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

使用任一:

或者

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

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

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

您可以使用c_str() function 获取指向 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 方法的开始/结束兼容容器。 因此,例如,如果您决定想要一个 QString(字符串 QT 使用)或 AWS::String 或 std::vector 来保存您的字符,则 c_str() 方法不起作用,但上面的方法会起作用。

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

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

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

清晰度、兼容性和效率。

编辑:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM