string.c_str是Borland封装的String类中的一个函数,它返回当前字符串的首字符地址。

c_str函数的返回值是const char*的,不能直接赋值给char*,所以就需要我们进行相应的操作转化。

#include <iostream>
#include <string>
int main() {  std::string s = "Chelse";  const char *str = s.c_str();  std::cout << str << std::endl;  s[1] = 'm';  std::cout << str << std::endl;  return 0;
} 

第一个输出 当然是 Chelse;
第二个输出呢: Chelse还是Cmelse呢?
答案是Cmelse。
const char*的值应该是个常量啊,怎么还能改变值呢?
这就是很多人遇到的坑儿,也许面试的时候你会顺利的回答出来,但是在实际的工程中,往往掉进坑儿里,难以自拔。
const char*, char const*, char* const的区别是什么?老
const char*与char const*是等价的,指的是指向字符常量的指针,即指针可以改变指向但其指向的内容不可以改变。
而char* const相反,指的是常量指针,即指向不可以改变但指针指向的内容可以改变。因此这里的const char*指向的内容本类是不可以改变的。

那么这里为什么改变了呢?这跟str这个const char*的生命周期及string类的实现有关,string的c_str()返回的指针是由string管理的,因此它的生命期是string对象的生命期,而string类的实现实际上封装着一个char*的指针,而c_str()直接返回该指针的引用,因此string对象的改变会直接影响已经执行过的c_str()返回的指针引用。

看下官方说法:

const charT* c_str() const;
Returns: A pointer to the initial element of an array of length size() + 1 whose first size() elements equal the corresponding elements of the string controlled by *this and whose last element is a null character specified by charT().
Requires: The program shall not alter any of the values stored in the array. Nor shall the program treat the returned value as a valid pointer value after any subsequent call to a non-const member function of the class basic_string that designates the same object as this.

简而言之,调用任何 std::string 的非 const 成员函数以后,c_str() 的返回值就不可靠了。

没有躲过的坑--string中的c_str()陷阱相关推荐

  1. 没有躲过的坑--vector使用erase后迭代器变成野指针

    没有躲过的坑--vector使用erase后迭代器变成野指针以及remove和erase的区别 本博客转载自:http://blog.csdn.net/wangshubo1989/article/de ...

  2. 正确姿势避坑 Python 中的6个典型错误

    点击关注我哦 一篇文章带你使用正确姿势避坑 Python 中的6个典型错误 Python是一种高级的动态脚本语言.它易于使用的特性使得它非常流行,并且在最近几年得到了扩展.易用性也从易滥用开始.我们列 ...

  3. string中的Copy-on-Write技术

        在谈这项技术之前,我们先来了解一下string类内存分配.string类有一个私有成员,其类型是一个char*,记录用户从堆上分配内存的地址,其在构造时分配内存,在析构时释放内存.因为是从堆上 ...

  4. C++从string中删除所有的某个特定字符

    C++中要从string中删除所有某个特定字符, 可用如下代码 str.erase(std::remove(str.begin(), str.end(), 'a'), str.end()); 其中,  ...

  5. 为什么String中的Java hashCode()使用31作为乘数?

    本文翻译自:Why does Java's hashCode() in String use 31 as a multiplier? Per the Java documentation, the h ...

  6. C++ string中find ,rfind 等函数 用法总结及示例

    string中 find()的应用  (rfind() 类似,只是从反向查找) 原型如下: (1)size_t find (const string& str, size_t pos = 0) ...

  7. String中的“equal方法”和“==”

    二话不说,先来说下重写的事情: 在Java中,String .Math.还有Integer.Double....等这些封装类重写了Object中的equals()方法,让它不再比较其对象在内存中的地址 ...

  8. 从String中移除空白字符的多种方式!?差别竟然这么大!

    字符串,是Java中最常用的一个数据类型了.我们在日常开发时候会经常使用字符串做很多的操作.比如字符串的拼接.截断.替换等. 这一篇文章,我们介绍一个比较常见又容易被忽略的一个操作,那就是移除字符串中 ...

  9. string:删除string中指定位置的字符?指定的所有字符?

    使用迭代器删除string中指定位置的字符! string str = "huehfudhfruhgfsfgkhdyfsghydff";string::iterator itr = ...

最新文章

  1. Windows 10 周年更新后TPM的一个bug?
  2. DeepMind开源强化学习环境,灵活可配置,计算资源有限的小型实验室也能用
  3. Java IO流之转换流
  4. 正则表达式从基础到深入实战
  5. 区块链实践(一) 以太坊网络+geth搭建私有网络实战
  6. centos7日志文件_Shell 脚本自动监控重启 httpd 服务并记录日志
  7. qchart画完以后删除_冬天的夜晚很难画?老师分步骤教你画,简单易学,收藏起来临摹...
  8. 建立学生选课表 mysql 语句_学生选课数据库SQL语句45道练习题整理及mysql常用函数(20161019)...
  9. vue监听滚动事件,实现滚动监听
  10. css3简记,了解一下?
  11. 【路径规划】基于matlab粒子群优化蚁群算法最短路径规划【含Matlab源码 076期】
  12. c++:template使用中的常见报错
  13. python加载mnist数据集
  14. python汉化之后好用吗_Python官方中文文档上线了:各种教程已汉化,不用再苦等野生翻译...
  15. MySQL复制一张表数据到另一张新表
  16. 医咖会stata 笔记(自己能看懂版
  17. 全球创业新趋势:私域流量+DTC,蜂巢跨境私域课堂
  18. 转: GSM信令流程
  19. 权利是人赋而非天赋的
  20. Verilog动态截取固定位宽

热门文章

  1. 【巨人的肩膀上制造世界】——10——Unity3D实用插件之Vectrosity,轻松便捷的实现2D/3D画线功能
  2. oracle delete not in 优化,Oracle中的sql语句优化
  3. 计算机主机的光驱怎么打开,笔记本电脑光驱,教您笔记本光驱怎么打开
  4. 最简单的基于Flash的流媒体示例 网页播放器(HTTP,RTMP,HLS)
  5. 高中英语试验修订本(第一册)上(人教版)
  6. 柔宇科技掀起的柔性电子潮流,正在加速改变我们的生活
  7. keil写代码时遇到的问题——warning:implicit declaration of function XXXX is invalid in C99
  8. 主流Wifi芯片简要介绍
  9. Leetcode 1564 把箱子放进仓库里1
  10. 访问web页面出现Whitelabel Error Page原因