C语言

先看如下程序:

#include<stdio.h>
#define M 2
#define N 3
int main()
{float* average_stu(float score[][3]);//函数声明float score[M][N]={{89,99,80},{100,88,90}}, *aver_stu;int i;
//每个学生平均成绩aver_stu=average_stu(score);//函数调用printf("add_student 222: %d\n\n",aver_stu);for(i=0;i<M;i++){printf("The average of %dth student is :%5.2f\n",i,*(aver_stu+i));}return 0;}
//求每个学生的平均分
float* average_stu(float score[][3])
{int i,j;float aver[M];float sum=0;for(i=0;i<M;i++){sum=0;for(j=0;j<N;j++)sum+=score[i][j];//每个学生的总成绩//aver=(float*)malloc(sizeof(float));aver[i]=sum/3;}printf("\nadd_student111: %d\n\n",aver);return aver;
}

函数原意: 利用函数 float* average_stu(float score[][3])计算每个学生的平均成绩,保存到一个一维数组中,最后返回一维数组的首地址,并在主函数中用一个指针变量接收该数组首地址。但是这样主函数接收了首地址之后输出的数据是没有意义的。输出结果如下:

原因: C语言中不能返回一个局部变量。函数 float* average_stu(float score[][3])中定义的float aver[M];是一个局部变量,其作用域仅限于本函数中,一旦函数结束,其中的空间就会被释放掉。所以即使返回了数组aver的首地址,但是由于数组内容已经被释放掉,所以输出不了任何有意义数据。

解决方法1:使用静态变量: 将函数 float* average_stu(float score[][3])中float aver[M];变量定义为静态变量(函数结束之后其值仍然保留)static float aver[M];。这样就可以在主函数中调用并输出数组aver的值了。

解决方法2:使用全局变量: 变量float aver[M];定义为全局变量,那么函数 float* average_stu(float score[][3])变为函数 void average_stu(float score[][3]),就可以在主函数中直接输出数组aver的元素值。

解决方法3:用动态变量: 将变量aver换为动态变量float *aver; 并用malloc为其开辟存储空间。修改后的 float* average_stu(float score[][3])函数如下:

//求每个学生的平均分
float* average_stu(float score[][3])
{int i,j;float *aver;aver=(float*)malloc(sizeof(float));float sum=0;for(i=0;i<M;i++){sum=0;for(j=0;j<N;j++)sum+=score[i][j];//每个学生的总成绩aver[i]=sum/3;}printf("\nadd_student111: %d\n\n",aver);return aver;
}

**解决方法4:使用参数传递数组:**将数组做为函数参数传递到另一个函数中,不需要利用返回值返回数组地址。这样在另一个函数中对数组的修改会被保留下来。如:上述代码修改如下

#include<stdio.h>
#define M 2
#define N 3
int main()
{float* average_stu(float score[][3],float *aver_stu);//函数声明float score[M][N]={{89,99,80},{100,88,90}}, *aver_stu;int i;
//每个学生平均成绩average_stu(score,aver_stu);//函数调用printf("add_student 222: %d\n\n",aver_stu);for(i=0;i<M;i++){printf("The average of %dth student is :%5.2f\n",i,*(aver_stu+i));}return 0;}
//求每个学生的平均分
void average_stu(float score[][3],float *aver_stu)
{int i,j;float aver[M];float sum=0;for(i=0;i<M;i++){sum=0;for(j=0;j<N;j++)sum+=score[i][j];//每个学生的总成绩//aver=(float*)malloc(sizeof(float));aver[i]=sum/3;}
}