改错题 1.  下列给定程序中,函数proc()的功能是:对M名学生的学习成绩,按从低到高的顺序找出m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,将此存储区的首地址作为函数值返回。
    请改正程序中的错误,使它能得出正确的结果。
    注意:不要改动main()函数,不得增行或测行,也不得更改程序的结构。
    试题程序:
    #include<stdlib.h>
    #include<conio.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;
    //****fond****
    t[k].num=b[j].num;
    t[k].s=b[j].s;
    b[j].s=100;
    }
    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",81},{"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("\nGive the number of the students who have
    lower score:");
    scanf("% d",&m);
    }
    while(m>10)
    {
    printf("\nGive the number of the students who have
    lower 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”中的“.num”。