为什么同样是将字符串复制给另一个函数之后,输出原函数,为什么第一个可以输出,第二个输出不了,并且第二个连指针p也输出不了

第一个


#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);
    puts(a);
    return 0;
}

第二个

#include<stdio.h>
int main()
{
    char *a="I am a student";
    char b[]="You are a student";
    char *p=b;
    for(;*a!='\0';a++,p++)
        *p=*a;
    *p='\0';
    
    puts(a);
//    puts(b);
    puts(p);
    return 0;
    
}

第一个按说b是需要先malloc一个动态内存空间的,你这没有做,可能系统自动为b分配了动态空间,所以,可以输出b。
第二个,b的指针指向的是一个常量字符串,是一个静态内存空间,是不可以修改的,即便用p去取得b的指针地址,让然还是指向那个静态空间,因此p无法输出。

第一个,你没有修改a的地址,而是用了a+i这种方式寻址
第二个,你直接把a给改了,它已经不指向原字符串的首地址了,而是指向结尾
你想直接改没问题,改之前先用一个指针变量把当前指针存起来,别弄丢了啊