题目是这样的,在主函数里输入 5 个考生的 3 门课考试成绩,然后找出有两门以上不及格的学生,并输出其学号和不及格课程的成绩。我定义了一个指针函数。
int *failed(int num,int *(*score)){/*定义找出不及格学生的函数,
参数 num 为总学生人数,
指针 score 指向一个二维数组,
即存储所有学生的各科成绩(并非单科)。
*/
int i,j,t,p;/*i,j 为双重循环变量,
t 临时记录某个学生不及格科目的数量,
p 记录满足不过关条件的人数,以便在结果中释放相应大小的空间。
*/
int *c=NULL;//c 指针为最终返回结果,先初始化为空。
p=0;//初始化总不及格人数为 0
for(i=0;i<num;i++){//现在开始逐个核对
t=0;//在没有核对之前,先将这个人的不及格科目数初始化为 0
for(j=0;j<3;j++){//核对第 i 个人的每个科目成绩
if(score[j][i]<60){//如果第 i 个人的第 j 门课的成绩为不及格
t++;//那么不及格数量加 1
}
}
if(t>=2){//统计完成后,如果发现第 i 名学生的不及格科目数在 2 门以上
c=(int *)malloc(4*sizeof(int));/*那么就给 c 指针释放 4 个整型数据的空间,
这 4 块内容分别存放学号和所有不及格的考试成绩
(如果有哪门课及格了,那么就存入 -1)
*/
c[4*p]=i;//在刚才释放的四块区域的首位存入该学生的学号
for(j=0;j<3;j++){/*后三块区域依次存入三门课的成绩,
如果有已经及格的科目,那么存入 -1,在主程序中不予考虑。
*/
if(score[j][i]<60){
c[4*p+j+1]=score[j][i];
}
else{
c[4*p+j+1]=-1;
}
}
p++;//存储完一个学生的信息后,不及格人数要加 1。
}
}
return c;//当所有不及格学生的信息都存储完毕后,返回整个指针。
}
但是,每次当程序执行到 c[4*p]=i; 这一句的时候就说指针引用错误。就是在给 c 指针释放 4 个整数型空间的下面一句。到底是为什么呢?
附一下主程序:
void main(){
int score[3][5];
char name[5][32];
int *c=NULL;
int i,j,*p;
for(i=0;i<5;i++){
printf("Input the name of Student %d:",i+1);
scanf("%s",name[i]);
for(j=0;j<3;j++){
printf("Input the score of Student %d in Course %d:",i+1,j+1);
scanf("%d",&score[j][i]);
}
}
c=failed(5,score);
p=&c;
if(p){
printf("The following student(s) are failed in this exam.\n");
do{
printf("Student %d",(*p)+1);
printf("(%s)\n",name[*p]);
for(j=0;j<3;j++){
p++;
if(*p!=-1){
printf("Course %d:%d\n",j+1,*p);
}
}
p++;
}while(p);
}
free(c);
}