作者:wei5xiao5zou6bian6tian | 来源:互联网 | 2023-07-20 14:24
今天看Cherno的视频,发现
const char* name = "www";
char name[] = "qw";
含义是不同的,第一行的意思是,我们只返回了一个指向字面值字符串内存的指针,这块内存是只读的,所以当我们即使将该指针转为char* 的,我们对内存种的内容进行更改,那也不一定会成功,因为这是一种未定义的行为(意思是C++标准也没说遇到这种情况该怎么做,完全取决于不同的编译器)
像我现在使用的是minGW64编译器进行如下操作后
const char *name = "123";
char *pname = const_cast(name);
pname[2] = '4';
cout < 程序在一段时间后并没有输出&#xff0c;应该是crash掉了。
而将字面值字符串转为字符数组之后&#xff0c;意义就完全不一样了&#xff0c;编译器开辟了一块内存&#xff0c;用于存储字符数组的值&#xff0c;并且该数组被初始化为"qw" &#43; \0的值。这块内存是完全可读可写的
输出
可以看到内存中的值已经被更改
最后的最后&#xff0c;说一下这两种写法在内存中是怎么样的
首先永远记住一点&#xff1a;"www"这种字面常量字符串永远都只在只读内存中&#xff0c;Always&#xff01;
所以const char* name &#61; "www";做的事情就是简单的返回"www"所在只读存储的地址
而&#96;char name[] &#61; "wq";&#96;做的事情就是将只读存储区"wq"的内容复制到一块新的内存中去&#xff0c;这块内存可读可写&#xff0c;并将内存块的首地址返回给name
That‘s all&#xff01;