c_str总是返回相同的地址吗?
Does c_str Always Return the Same Address?
我知道c++ 11对string
做了相当多的更改。其中最重要的是需要在内存中线性布局。
在c++ 11之前,对string::c_str
的调用将返回一个const char*
,但它保证是相同的吗?例如,给定string foo
,这是否保证为真,或者它们可能返回不同的地址?
foo.c_str() == foo.c_str()
EDIT:我应该补充说,我在问string::c_str
的返回是否总是一致的,只要没有在foo
上调用方法,这将使其迭代器无效。
编辑:阅读标准中的同一段,我现在得出结论,对方法data()/c_str()的后续调用允许使先前返回的指针无效(即使您没有做任何其他事情),所以您的问题的答案将是否,多么讽刺。
原始回答:
可以,只要在对象上执行的非const操作只有operator[]、at、begin、rbegin、end和rend。
data()/c_str()返回指向字符串第一个元素的指针。参见标准(N1905),第21.3页[类模板basic_string]:
- 指向basic_string序列元素的引用、指针和迭代器可能被basic_string对象的以下用法:
-作为非成员函数swap()(21.3.7.8)、operator>>(21.3.7.9)和getline(21.3.7.9)的实参。
-作为basic_string::swap()的参数。
-调用data()和c_str()成员函数
—调用非const成员函数,除了操作符[]、at、begin、rbegin、end和rend。
-在构造函数或上述任何一种用法之后,除返回迭代器的insert和erase形式外,对非const成员函数operator[]、at、begin、rbegin、end或rend的第一次调用
相关文章:
- 从 C++ 中的函数返回数组地址问题
- inet_ntop返回不存在的地址
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 为什么按值返回的对象与方法中的对象具有相同的地址?
- 返回数组中值的指针地址
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 返回地址上的WriteProcessMemory
- 指针地址的内存偶尔更改了函数前和后返回
- libmysql:警告:返回局部变量"行"的地址(C++/C)
- 在字符串函数的指针中返回地址
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 重载新返回错误的地址
- 为什么 C++ 中的字符数组返回其项目而不是地址?
- 为什么 c_str() 在返回常量指针值时不输出地址
- 英特尔 Pin:如何获取系统调用的返回地址
- 按价值和地址返回
- ReadProcessMemory()为静态地址返回0
- 访问存储在指针变量所指向的地址中的值(这是一个地址)返回垃圾值
- 将地址返回给局部变量与返回指向局部变量的指针