#include <stdio.h>
int main()
{
void change(char p[]);
char a[] = "I am a girl.";
change(a);
printf("%s\n", a);
return 0;
}
void change(char *p)
{
p = "I am a boy";//倒数第四行
*p = 'Y';//倒数第三行
printf("%s\n", p);
}
倒数第三行和倒数第四行,只要任意删除一行,编译都能通过,但是放在一起的话,倒数第三行就会出现问题,为什么呢?原本函数的过程是,重新给p指向 "I am a boy",并把首字符改为'Y'.
p是字符数组的首地址(此地址在栈区),p= "I am a boy"将p的地址变成存放字符串字面值常量的地址(此地址在全局/静态存储区),对p解引用即p是非法的,如果没有这句,光光只有p= 'Y',那么就是将字符数组第一个字符变成Y。
内存四大分区:
堆区
栈区
全局/静态存储区
代码区