1.string和c_str()

string str = "hello";
const char* cstr = str.c_str();
str = "yep,i m";

本来是以为str.c_str()会把str中包含的字符串在内存中开辟一个新空间存放进去,然后由cstr指向(现在怎么想都不合理,因为调用n次c_str就创建n个拷贝的话,它没有回收是有很大问题的),但是实际上cstr指向的是str的首地址:

string str = string("hello");
const char* c_s1 = str.c_str();
const char* c_s2 = str.c_str();
printf("%x\n",&str); //e3fa1c
printf("%x\n",c_s1); //e3fa1c
printf("%x\n",c_s2); //e3fa1c
str = "ddd...ddd"; //假设这里有1w个d
printf("%s\n", str); //1w个d
printf("%s\n", c_s1); //垃圾值
c_s1 = str.c_str();
printf("%s\n", c_s1); //1w个d
printf("%x\n",c_s1); //11f1fe8

当str的值发生小幅度变化时,cstr因为指向它也会发生变化,同理,当string为局部变量时,如果返回值为const char*的话,就会因为函数结束,string被回收而导致const char*指向一个垃圾值;

如果str的值发生了很大的变化的话,string是std的字符容器,进行扩容时就会把整个大字符串移动到某块内存,然后令自身指向那块内存,并且回收原来的内存,这样原先的const char*指向的空间就被回收了。

2.C++中去除const修饰

去除const修饰的方法不止一种,最简单的就是直接const_cast

string sstr = "hhhh";
const char* cstr = sstr.c_str();
char* str = const_cast<char*>(cstr);
str[1] = 'y';
cout<<sstr<<endl;
return 0;

当然,和C语言一样,一个char*指向一个const char*指向的地址并不意味着可以为所欲为,如果const char*指向的是字符串常量的话,char*指向它然后修改的话同样会产生段错误。

然后还有一个有趣的例子:

const int i = 0;
const int* pi = &i;
int& ret = const_cast<int&>(i);
cout << "i (" << &i << "):" << i << endl;
cout << "ret(" << &ret << "):" << ret << endl;
ret = 15;
cout << "i (" << &i << "):" << i << endl;
cout << "ret(" << &ret << "):" << ret << endl;

最新文章

  1. ASP.NET c# textbox 正则表达式 文本框只允许输入数字(验证控件RegularExpressionValidator )
  2. [原创]mac终端前面的计算机名怎么改??
  3. AD RMS Bulk Protection Tool 批量加密解密office文档
  4. 格式化格林威治时间(Wed Aug 01 00:00:00 CST 2012)
  5. 工作中的趣事:聊聊ref/out和方法参数的传递机制
  6. 7_SQL Server通过代码删除数据
  7. [知了堂学习笔记]_牵线Eclipse和Tomcat第一篇 —— 配置Java环境变量&amp;&amp;安装eclipse
  8. 2018-2019-2 网络对抗技术 20165231 Exp2 后门原理与实践
  9. JS检测浏览器是否最大化
  10. python—正则表达式
  11. Vue项目打包常见问题整理
  12. Android开发环境搭建篇详尽的教程实例汇
  13. MySQL添加字段和修改字段
  14. Filter应用之-验证用户是否已经登录
  15. 关于AC自动机和DP的联系
  16. Oracle Net Manager 服务命名配置以及用PL/SQL 登陆数据库
  17. 训练超参数, 出现 Cannot use GPU in CPU-only Caffe 错误?
  18. spring中scope的prototype与singleton区别
  19. HDU 5793 A Boring Question (找规律 : 快速幂+乘法逆元)
  20. POJ 2182 Lost Cows (求序列第k大)

热门文章

  1. CF1311F Moving Points
  2. MySQL错误锦集【持续更新】
  3. vue弹窗后如何禁止滚动条滚动
  4. ASP.NET Core - 依赖注入(四)
  5. linux系统下,添加硬盘并挂载到操作系统的shell 脚本范例
  6. NSIS Inetc插件 扩展使用
  7. 浅谈flume
  8. 如何使用新版bing(支持ChatGPT)
  9. byte最高位
  10. 关于精准UWB人员定位系统解决方案