当前位置: 代码迷 >> C语言 >> 子函数开辟的内存空间如何释放?
  详细解决方案

子函数开辟的内存空间如何释放?

热度:354   发布时间:2007-12-16 21:57:38.0
子函数开辟的内存空间如何释放?
#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等函数,则必须保证内存在应用结束后得到释放(应需要反复迭代),函数应也能同时返回双精度的元素值和行列信息。
  由于使用全局变量会给函数模块带来不利影响,暂不考虑。
搜索更多相关的解决方案: 内存  mat  函数  mul  double  

----------------解决方案--------------------------------------------------------
  在主函数p=mat_mul(A,B,2,2,2);后加上
  free(p);
  可以吗?

  呵呵,是不是在调用子函数之后释放指针就可以了?还望各位大侠不吝赐教!

  
----------------解决方案--------------------------------------------------------
  刚刚验证过,可以采取这种方法。
----------------解决方案--------------------------------------------------------
子函数开辟的内存空间,在子函数调用完后自动释放,不需要任何操作!
----------------解决方案--------------------------------------------------------
  楼上的可能误会了,如果是常规的子函数您的说法没错,但在这个特例中并非如此。
  本文中的子函数采用<stdlib>中的calloc专门开辟了内存空间,并不会在调用之后立即释放。若您在主函数int main的    for(i=0;i<4;i++) C[i]=p[i];语句后面加入    
for(i=0;i<4;i++)   printf("%10g",p[i]);
你会发现此程序段的运行结果为        19        59        15        46,显然*p所指向的内存空间并未得到释放。
若在刚才的语句前加上free(p);空间释放后,若在VC6下运行,程序段结果变成了-1.45682e+144-1.45682e+144-1.45682e+144-1.45682e+144.
  在大型程序中,由于需要进行反复迭代,若不需要的空间得不到及时释放,内存被占满只是一个时间问题,我可是深有体会

[[italic] 本帖最后由 许一民 于 2007-12-17 11:41 编辑 [/italic]]
----------------解决方案--------------------------------------------------------
不好意思!我没看例子!
----------------解决方案--------------------------------------------------------
呵呵,没关系的,还是谢谢您的帮助!
----------------解决方案--------------------------------------------------------