利用指针操作进行字符串复制

问题:输入一个字符串到字符数组s1中,将s1中的字符串复制到字符数组s2中并输出s2中的字符串。

用数组下标操作可以很容易实现:

#include<stdio.h>
#include<string.h>
int main(void)
{
    char s1[10],s2[10];
    int i;
    scanf("%s",s1);
    for(i=0;i<=strlen(s1);i++)
    {
        s2[i]=s1[i];
    }
    printf("%s",s2);
    return 0;    
}

然后想试一试用指针操作,但遇到了问题:
这样写代码就会出问题,运行结果中并不能打出s2(其中s1以及确保能够接受到输入的字符串)

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    char *s1,*s2;
    int i;
    s1=(char*)malloc(sizeof(char)*10); 
    s2=(char*)malloc(sizeof(char)*10); 
    scanf("%s",s1);
    while((*s2++ = *s1++) != '\0')
        ;
    for(i=0;i<6;i++)
        printf("%c",s2[i]);
    return 0;    
}

但这样就可以:

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    char *s1,s[10];
    int i;
    char *s2=s;
    s1=(char*)malloc(sizeof(char)*10); 
    scanf("%s",s1);
    while((*s2++ = *s1++) != '\0')
        ;
    for(i=0;i<6;i++)
        printf("%c",s[i]);
    return 0;    
}

是什么原因呢?
另外指针操作是不是不太好实现‘\0’也复制的要求。