C语言的函数问题(设计到字符指针)


#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。
内存四大分区:
堆区
栈区
全局/静态存储区
代码区