程序中的两个while语句是如何执行的?(语言-c语言)

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include <stdio.h>
int conj(char *p1,char *p2);
int main()
{
    char s1[80],s2[80];
    gets(s1);gets(s2);
    conj(s1,s2);
    puts(s1);
    return 0;
}
int conj(char *p1,char *p2)
{
    while(*p1)p1++;
    while(*p2){*p1=*p2;p1++;p2++;}
    *p1='\0';
    return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

while(*p1)p1++;//p1指针向后移动直到指向空结束
while(*p2){*p1=*p2;p1++;p2++;}//通过p2给p1赋值,同时p1,p2指针向后移动,当p2结束为止

while(*p1)p1++;//只要p1指针不为空,p1++ ,直到p1指向数组外
while(*p2){*p1=*p2;p1++;p2++;}// 只要p2指针不为空,p1指针就等于p2指针,p1++,p2++;直到p2指向数组外