#include <stdio.h>
int main(void)
{
char *p = "abcd";
p[1] = 'w';
printf(p);
return 0;
}
编译通过,但是运行时会出现段错误
#include <stdio.h>
int main(void)
{
char str[] = "abcd";
str[1] = 'w';
printf(str);
return 0;
}
编译通过,运行也很正常。
解释:
字符串 abcd 存放在常量区,它只是可读的,不可修改,而指针变量p和数组str都是存放在栈区。
第一个程序声明的指针,指向的数据类型为char,而并没有给这个指针动态开辟一块内存区,
char *p = "abcd";这条语句的动作只是让指针指向存放abcd字符串的常量区,所以,不能修改。而第二个程序声明可一个数组,同样它也是在栈区上的,但是,声明了这个数组后在函数的栈区开辟一个内存区域,同时,将这个内存区用abcd字符串填充。所以,它是可以修改的。