这样返回指针为什么只能输出一个元素解决方案

这样返回指针为什么只能输出一个元素
#include   <stdio.h>
int *judge   (char   ch[100],int   i);
main   ()
{
char ch[100];
int *p,i=0,j=0;
scanf( "%s ",ch);
while   (ch[j++])   i++;  
p=judge(ch,i);  
printf( "Big   letter:%d\n ",*p);
printf( "Small   letter:%d\n ",*(p+1));
printf( "Space:%d\n ",*(p+2));
printf( "Number:%d\n ",*(p+3));
printf( "Others:%d ",*(p+4));
getch();

}


int *judge   (char   ch[100],int   i)
{
int a[5]={0,0,0,0,0},j,*p;
for   (j=0;j <i;j++)
{
if   (ch[j]> = 'A '   &&   ch[j] <= 'Z ')
a[0]++;
else   if   (ch[j]> = 'a '   &&   ch[j] <= 'z ')
a[1]++;
else   if   (ch[j]== '   ')
a[2]++;
else   if   (ch[j]> = '0 '   &&   ch[j] <= '9 ')
a[3]++;
else   a[4]++;
}
p=a;
return   p;
}

这样返回指针为什么只能输出一个元素...

------解决方案--------------------
程序的意图是:返回指针变量p存放一维数组a的首地址,也就是让p指向元素a[0]。然后分别输出*p、*(p+1)、*(p+2)、*(p+3)、*(p+4),来达到输出a[0]——a[4]的目的。
失败的原因:虽然在调用函数judge时p指向a[0],但在函数调用结束后,形参数组a会被释放掉,所以p无法指向数组a的元素,导致最后的输出不正常。
------解决方案--------------------
int *judge (char ch[100],int i)
{
int a[5]={0,0,0,0,0},j,*p;
for (j=0;j <i;j++)
{
if (ch[j]> = 'A ' && ch[j] <= 'Z ')
a[0]++;
else if (ch[j]> = 'a ' && ch[j] <= 'z ')
a[1]++;
else if (ch[j]== ' ')
a[2]++;
else if (ch[j]> = '0 ' && ch[j] <= '9 ')
a[3]++;
else a[4]++;
}
p=(int *)malloc(sizeof(int)*5);
memset(p,0,sizeof(int)*5);
memcpy(p,&a,sizeof(int)*5);
return p;
}
不过记得在调用后,删除指针P,否则会发生内存泄露问题.
------解决方案--------------------
還有scanf( "%s ",ch); 當遇到空格就不會再讀入下面的字符了
可以把返回值 int * 作為judge的參數 void judge(char* , int, int* );
------解决方案--------------------
指针返回的是地址,

将这个地址强制转换成其他类型就可以告诉编译器一次读这个地址开始的多大

如果强制转成结构,那就可以用‘.’来引出结构的成员了