字面常量字符串的一些思考

今天看Cherno的视频,发现

const char* name = "www";
char name[] = "qw";

含义是不同的,第一行的意思是,我们只返回了一个指向字面值字符串内存的指针,这块内存是只读的,所以当我们即使将该指针转为char* 的,我们对内存种的内容进行更改,那也不一定会成功,因为这是一种未定义的行为(意思是C++标准也没说遇到这种情况该怎么做,完全取决于不同的编译器)

像我现在使用的是minGW64编译器进行如下操作后

const char *name = "123";
char *pname = const_cast<char*>(name);
pname[2] = '4';
cout << pname << endl;

程序在一段时间后并没有输出,应该是crash掉了。

 

而将字面值字符串转为字符数组之后,意义就完全不一样了,编译器开辟了一块内存,用于存储字符数组的值,并且该数组被初始化为"qw" + \0的值。这块内存是完全可读可写的

输出

可以看到内存中的值已经被更改

最后的最后,说一下这两种写法在内存中是怎么样的

首先永远记住一点:"www"这种字面常量字符串永远都只在只读内存中,Always!

所以const char* name = "www";做的事情就是简单的返回"www"所在只读存储的地址

而`char name[] = "wq";`做的事情就是将只读存储区"wq"的内容复制到一块新的内存中去,这块内存可读可写,并将内存块的首地址返回给name

That‘s all!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值