%s要对应char *或char []类型的变量,而b只是char型变量。用printf("%c", b);就可以输出b的字符。如果printf("%s",b);实际上就是把字符'2'的asc码值当作地址去输出字符串,而这个地址是禁止访问的,所以会出现程序执行错误。
%s需要一个char *,不是char,显然是语法有错误。对于语法检查不严格的编译器,这个是忽略了。对于检查严格的编译器,会检查格式化输出%格式对应的数据类型至少会给出一个warning的。