子函数开辟的内存空间如何释放?
#include <stdio.h>#include <stdlib.h>
double *mat_mul(double A[],double B[],int I,int K,int J)
{
int i,j,k;double *mat_mul_return;
mat_mul_return=calloc( I*J , sizeof(double) );
for(i=0;i<I;i++)
for(j=0;j<J;j++)
for(k=0;k<K;k++)
mat_mul_return[i*J+j] += A[i*K+k]*B[k*J+j];
printf("Subfunction output:\n");
for(i=0;i<I;i++)
for(j=0;j<J;j++)
{
printf("%12g",mat_mul_return[i*J+j]);
if(j==J-1)
printf("\n");
}
printf("End output!\n");
return mat_mul_return;
}
int main()
{
int i,j;
double A[]={4,5,3,4},B[]={1,6,3,7},*p,C[4];
p=mat_mul(A,B,2,2,2);
for(i=0;i<4;i++)
C[i]=p[i];
printf("\nMatrix A:\n");
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
printf("%12g",A[i*2+j]);
if(j==1)
printf("\n");
}
printf("\nMatrix B:\n");
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
printf("%12g",B[i*2+j]);
if(j==1)
printf("\n");
}
printf("\nMultiply matrix A*B:\n");
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
printf("%12g",C[i*2+j]);
if(j==1)
printf("\n");
}
return 0;
}
上例为DFP算法中计算矩阵的一个子函数mat_mul,用calloc开辟了内存空间,但由于需要返回函数值不能立即释放,问题是:在子函数完成了预期功能,在传递函数值后如何释放mat_mul开辟的内存空间?
此外,还有一个引申出的问题:若需要在返回时同时返回结果矩阵的行数、列数及元素个数(必须是整型),应该如何实现。
如使用结构体,则必须保证其通用性:也即它应使用于一般的矩阵A[I*K]与B[K*J](I、J、K都在允许范围内)相乘的应用。举例而言,如3*2的矩阵与2*4的矩阵相乘,由于结果是3*4的矩阵(14个元素),此结构体就应是12个双精度型后接3个整型数(C的行数——3,C的列数——4,C包含的元素个数——12)。
如采用calloc、malloc等函数,则必须保证内存在应用结束后得到释放(应需要反复迭代),函数应也能同时返回双精度的元素值和行列信息。
由于使用全局变量会给函数模块带来不利影响,暂不考虑。