本篇博客介绍char* str = “hehe”;和char str[] = “hehe”;的区别。
首先,我们来看一个代码。
int main() {
char* str1 = "hehe";
char* str2 = "hehe";
char str3[] = "hehe";
char str4[] = "hehe";
printf("str1 = %p\n", str1);
printf("str2 = %p\n\n", str2);
printf("str3 = %p\n", str3);
printf("str4 = %p\n", str4);
return 0;
}
我们再来看一下运行结果:
从上面运行结果可以看出,str1和str2指向的是同一块区域。
下面,我们将代码调整一下,我们去修改一下字符串的内容来看一下:
int main() {
char* str1 = "hehe";
char* str2 = "hehe";
char str3[] = "hehe";
char str4[] = "hehe";
printf("str3: %s\n", str3);
str3[0] = 'H';
printf("str3: %s\n\n", str3);
printf("str1: %s\n", str1);
str1[0] = 'H';
printf("str1: %s\n", str1);
return 0;
}
运行结果如下:
为什么第四个printf没有执行结果,我们来调试一下:
可以看到,在对str1指向的字符串进行修改的时候发生了访问冲突,这是为什么呢?
这里,我们介绍一下char* str1 = "hehe";
和char str3[] = "hehe";
的区别:
- str1指向的字符串是存放在常量区的,所以str1和str2指向的是同一个字符串。常量区中的字符串具有只读属性,是不可被修改的;
- str3指向的字符串是存放在栈上的,所以str3和str4分别在栈上开了一段空间,来存储"hehe"字符串。是可读可写的。