改错题 1.  下列给定程序中,函数proc()的功能是:对M名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。
    请修改程序中的错误,使它能得出正确的结果。
    注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
    试题程序:
    #include<stdlib.h>
    #include<coriio.h>
    #include<string.h>
    #include<stdio.h>
    #include<malloc.h>
    #define M 10
    typedef struct ss
    {
    char num[10];
    int s;
    }
    STU;
    STU *proc(STU a[],int m)
    {
    STU b[M],*t;
    int i,j,k;
    //****found****
    *t=calloc(m,sizeof(STU));
    for(i=0;i<M;i++)b[i]=a[i];
    for(k=0;k<m;k++)
    {
    for (i=j=0;i<M;i++)
    if(b[i].s>b[j].s)j=i;
    //****found****
    t[k].num=b[j].num;
    t[k].s=b[j].s;
    b[j].s=0;
    }
    return t;
    }
    void outresult(STU a[],FILE*pf)
    {
    int i;
    for(i=0;i<M;i++)
    fprintf(pf,"No=%s Mark=%d\n",
    a[i].num, a[i].s);
    fprintf(pf,"\n\n");
    }
    void main()
    { STU stu[M]={{"A01",811,{"A02",89},
    {"A03",66},{"A04",87},{"A05",77},
    {"A06",90},{"A07",79},{"A08",61},
    {"A09",80},{"A10",71}};
    STU *pOrder;
    int i,m,
    system("CLS");
    printf("****THE RESULT****\n");
    outresult(stu, stdout);
    printf("\nCive the number of the students
    who have better score:");
    scanf("%d",&m);
    while(m>10)
    {
    printf("\nGive the number of the
    students who have better score:");
    scanf("%d",&m);
    }
    pOrder=proc(stu,m);
    printf("****THE RESULT****\n");
    printf("The top: \n");
    for(i=0;i<m;i++)
    printf("%s%d\n",pOrder[i].num,
    pOrder[i].s);
    free(pOrder);
    }
【正确答案】(1)错误:*t=calloc(m,sizeof(STU));
   正确:t=(struct ss*)calloc(m,sizeof(STU));
   (2)错误:t[k].num=b[j].num;
   正确:t[k]=b[j];
【答案解析】 因为t指向一个动态存储空间,因此,其是指针,而不是其中的内容,故把“*t=calloc(m,sizeof(STU))”改为“t=(struct ss *)calloc(m,sizeof(STU));”,题目要求把学生的全部内容互换,故把“t[k].num=b[j].num;”改为“t[k]=b[j];”。