p[2]=’w’;printf(p);getchar();return 0;编译通过,运行出错。
s[2]=’w’;printf(p);getchar();return 0;正常。
任何情况下,对字符串常量是不可以修改的。如”abcdef”。因为字符串常量在静态存储区。
char *p=”abcdef”;将p指向了该字符串常量;
char s[]=”abcdef”; 在栈上分配了字符串数组,将字符串常量”abcdef”的值拷贝到该数组中,该数组的值是可以修改的,但并没有修改静态存储区的字符串常量。
”abcdef”本身在静态存储区,char s[]=”abcdef”;这个式子把静态区”abcdef”的一个拷贝赋给了在栈里分配空间的一个数组s[],当改变s[2]的时候其实是改变了在栈里面的这个拷贝,存储在静态存储区的”abcdef”不受影响!
P在栈,指向的”abcdef”在静态存储区,当想改变p[2]时,就是想改动在静态存储区的数据,这是非法的。