先看两段程序:
//程序1,编译通过,运行出错
#include <stdio.h>
int main()
{
char *p="abcdef"; //p分配的地址在栈上,字符串"abcde"在静态存储区
p[2]='W';
printf(p);
getchar();
return 0;
}
//程序2,编译通过,运行正确
#include <stdio.h>
int main()
{
char p[]="abcdef"; //p分配的地址在栈上,字符串"abcde"在静态存储区
p[2]='W';
printf(p);
getchar();
return 0;
}
我们要看为什么程序1运行会出错而程序2运行正常,首先要明白变量p和常量字符串所在的存储位置。显然,常量字符串是存储在“静态存储区”,该存储区的内容只允许读,不允许写,也就是无法更改。程序1为变量p开辟了内存空间,且指向字符串“abcde”的首地址,由于指针p指向的是常量区,为p[2]赋值则表示更改常量区中字符串第二个字符的值,这是不允许的,因为常量区不允许写操作。而程序2中,虽然字符串“abcde”也是在常量区,也不允许写操作,但是在声明数组p时,已经分配内存空间,并且将常量区字符串的值拷贝到数组所在的栈空间内了,此时为p[2]赋值,并不是更改常量区的值,而是更改栈上的内容,栈的内容是允许写的,因此上面的问题就不难理解了...