[c语言]关于 scanf() 和 char数组 的小实验的问题

写了三个小的几乎一样的test代码,但是输出却不同,不明白为什么,求大神指点。
全部代码如下:
#include
void sub1(void);

int main()
{
/*test1*/
sub1();

/*test2 */
char w0[2]={'a','a'};         
char * pc0 = w0;      

printf("\nw1 = %s",w0);   /*wrong*/
printf("\nw1 = %s",pc0);   /*wrong*/

/*test3 */
char w1[2];         
char * pc = w1;  

printf("\n\nInput:");    
scanf("%2s",w1);          /*try input aa*/

printf("\nw1 = %s",w1);   /*right*/
printf("\nw1 = %s",pc);  /*right*/

return 0;

}

void sub1(void)
{
char w1[2];

char * pc = w1;

printf("\nInput:");    
scanf("%2s",w1);          /*try input aa*/

printf("\nw1 = %s",w1);   /*right*/
printf("\nw1 = %s",pc);   /*wrong*/

}
凡是scanf输入的地方,都是输入aa,然后回车。请问为何得到的结果,三个都不同。我在注释里标明了正常输出的代码和错误输出的代码。理论上3个实验中,字符串都没有用\0结尾,那么为何有些能够正常输出?

题主这个问题问的好,我学的时候就没有你这么细心。
观察一下就会发现,当需要手动输入2个字符时,最后就不会出错;
而初始化时赋值2个字符,输出就会有问题。
我们继续往后推:在命令行界面赋值和程序初始化赋值有什么区别?
那就是:初始化只给定字符,没有输入结束标志(没有'\0'),但手动输入时,我们最后都会敲一个回车键('\n'),那么在这里,回车就代表了字符数组结束标志。
即便数组大小都被限定,但是字符数组的第一限制不是大小而是结束标志!

你这基础,,,,,,醉了,,,,,,,好好看看SCANF的参数要求,在看看你的使用是不是正确的。