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可以被修改指向其他地址,但如果试图修改字符串的内容是没有定义的。
本文探讨了C语言中字符串常量与字符数组的区别,解释了为何字符串常量不可修改,而字符数组可以修改。同时介绍了字符串常量存放于只读内存区域的特点,以及字符数组在内存中的布局方式。
589

被折叠的 条评论
为什么被折叠?



