你和你的同事理解的都不太对
区分一下:
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";
===============================
编译器没有这么智能的,
如果用代码静态解析工具(例如:QAC),是可以查出来的。