为什么同样是字符串之间的复制,为什么第一个行,第二三个不行

第一个代码:

#include<stdio.h>
int main()
{
    char *a={"I am a student"};
    char *b;
    int i;
    for(i=0;*(a+i)!='\0';i++)
        *(b+i)=*(a+i);
    *(b+i)='\0';
    puts(b);
    return 0;
}

第二个代码:

#include<stdio.h>
int main()
{
    char*a="I love china";
    char *b="I am a student";
    int i;
    for(i=0;*(a+i)!='\0';i++)
        *(b+i)=*(a+i);
    puts(b);
    return 0;
}

第三个代码:

#include<stdio.h>
int main()
{
    char*a="I love china";
    char *b="I am a student";
    int i;
    for(i=0;*(b+i)!='\0';i++)
        *(a+i)=*(b+i);
    puts(a);
    return 0;
}

第一个代码虽然能运行,但实际是有问题的,因为b并未被分配空间就做了赋值。
第二、三个代码不行,是因为a和b的指针都指向常量字符串,属于不可修改空间,因此有问题。