char *s = "sjdkjfl";
s[3] = 'd';
上面的程序在编译的时候出现问题,而当改成下面数组样式的时候则通过了编译。
char s[] = "sjdkjfl";
*(s+2) = 'd';
在水源上提问,有大神回答
char * s = "sjdkjfl";
在内存空间里是分配到“只读内存区”
char a[] = "sjdkjfl";
则是以堆栈的形式(局部变量,若是全局变量则存在全局变量区)存在,是可以被修改的。
同时,引号包含的字符串都是不能被修改的,所以用数组形式其实是执行以下代码:
char a [strlen("sjdkjfl")+1];
memcpy(a, "sjdkjfl", strlen("sjdkjfl")+1);
下面用The C Programming Language的说明来进一步理解(p90)
char a[] = "now";
char *p = "now";
指针a始终指向一个存储位置,指向的位置不能修改,并且数组中的单个字符可以进行修改;而指针p可以被修改指向其他地址,但如果试图修改字符串的内容是没有定义的。