C++中一个难以理解的问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 18:29:29
char *p="sdfjsd";
*p='a';
上段代码报异常,我问公司的一个同事,他说,是因为"sdfjsd"这个字符串,是一个常量字符串,是分配在栈区,当我将'a'赋给*p时,内存已经释放了,但是如果是这样,为什么,为什么cout<<*p<<endl;却是对的呢?如果内存释放了,为什么还可以读取他的值呢?因此我对他的解释持怀疑态度,请求各路高手帮忙解答
实际上我也认为"sdfjsd"是常量字符串,所以对它赋值才会有异常,但是如果是这样,编译器为什么不在编译的时候就进行报错,而非到等到运行时再报异常,比如说,编译器可以要求我们在初始化的时候,用Const类型的指针来引用,const char *p="sdkfjls";

你和你的同事理解的都不太对

区分一下:
char *p="sdfjsd";
char p[7]="sdfjsd";

char *p="sdfjsd"; 中,
编译器会进行优化,将"sdfjsd"保存在常量区,"sdfjsd"也被作为常量,
而p是指向这个常量字符串的首地址。
所以*p='a',就是对于常量区进行赋值,所以报错。

char p[7]="sdfjsd";中,
编译器在栈区分配7个char型的连续地址空间,
而p是指向这个栈区的首地址。
所以*p='a',就是对于栈区进行赋值,没有问题。

还有一个区别也说一下吧:
char *p="sdfjsd";
char *q="sdfjsd";
这么写,p,q其实是指向同一个地址的,
刚才说了对于常量字符串,编译器会进行优化,只保存一个"sdfjsd"在常量区,
所以p,q指向的同一个地址

char p[7]="sdfjsd";
char q[7]="sdfjsd";
这么写,p,q指向不同的地址的,这个比较简单,就不多说了

===============================
问题补充:实际上我也认为"sdfjsd"是常量字符串,所以对它赋值才会有异常,但是如果是这样,编译器为什么不在编译的时候就进行报错,而非到等到运行时再报异常,比如说,编译器可以要求我们在初始化的时候,用Const类型的指针来引用,const char *p="sdkfjls";
===============================
编译器没有这么智能的,
如果用代码静态解析工