字符串两种形式
#include <stdio.h>
// 字符串两种形式
int main() {
// char strings[] = {'j', 'i', 'n'}; printf打印字符串要给字符串添加'\0'结尾
char strings[] = {'j', 'i', 'n', '\0'};
// strings[2] = 'm';
printf("strings = %s\n", strings);
char *strArray = "jin";
// strArray[2] = 'm';
printf("strArray = %s\n", strArray);
return 0;
}
字符串的创建过程:
使用:char strings[] = {'j', 'i', 'n', '\0'};创建字符串,
main函数进栈,执行char strings[] = {'j', 'i', 'n', '\0'}时,会先在静态区域开辟空间存储字符串“jin”,
然后将字符串“jin”拷贝到栈空间,并赋值给字符串函数strings;相当于栈空间和静态区域各存一份字符串“jin”。
使用:char *strArray = "jin";创建字符串,
main函数进栈,执行char *strArray = "jin"时,也会在静态区域开辟空间存储字符串“jin”,然后将字符串“jin”的内存地址赋值给栈空间的字符串函数strArray;相当于栈空间存的是字符串“jin”的内存地址,静态区域各存的是字符串“jin”。
字符串两种形式的内容修改
#include <stdio.h>
// 字符串两种形式
int main() {
// char strings[] = {'j', 'i', 'n'}; printf打印字符串要给字符串添加'\0'结尾
char strings[] = {'j', 'i', 'n', '\0'};
strings[2] = 'm';
printf("strings = %s\n", strings);
char *strArray = "jin";
strArray[2] = 'm';
printf("strArray = %s\n", strArray);
return 0;
}
使用:char strings[] = {'j', 'i', 'n', '\0'}创建字符串,修改成功;而使用:char *strArray = "jin"创建字符串,修改崩溃;是因为strings[2] = 'm';修改的是栈空间存储的字符串“jin”,栈空间操作修改是允许的;strArray[2] = 'm';修改的是栈空间指向的静态区域存储的字符串“jin”,静态区域拒绝访问,不允许修改静态区域的字符串,所以出现崩溃。