首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么下面的代码内存不足?

为什么下面的代码内存不足?
EN

Stack Overflow用户
提问于 2016-09-10 13:54:47
回答 1查看 57关注 0票数 0

下面的代码描述了两个谐波振荡器。他们最初是不耦合和独立的,我只看其中一个,这是一个机械振荡器。另一个振子的变量已经声明并强制为0。我首先进行300,000次迭代,并对80种不同频率的wdm (机械驱动w)进行迭代。

代码语言:javascript
运行
复制
//find frequency response
int index_A;
double wdm_1;
wdm_1=wm-2*3.142*2e5;
double wdm_2;
wdm_2=wm+2*3.142*2e5;
double wdm_prec=2*3.142*5e3;
index_A=(wdm_2-wdm_1)/wdm_prec;
printf("%d \n", index_A);

但是,我的代码运行到58个频率,并给出了这个错误:

奇怪的是,如果我在40种频率的两部分运行代码并将文件附加在一起,它就能正常工作.。

频域共振峰

也是如此,当我将v0的大小缩小到3时,代码可以正常工作。但是,稍后我需要其他变量。

代码语言:javascript
运行
复制
int j=0;
    for (j=0; j<= index_A ; j++){
        wdm=wdm_1+j*wdm_prec;
        printf("%d \n",j);
        v0[0] = 0;
        v0[1] = 0;
        v0[2] = 0;
        v0[3] = 0;
        v0[4] = 0;
        v0[5] = 0;
        v0[6]= wdm;

            for (i=0; i< n ; i++){
                if (cabs(xa)>=1){
                        printf("Breaking Loop \n");
                        break;
                        }

                v1 = rk4vec_ameya_complex_1 ( tau, 7, v0, dtau, rk4vec_f_ameya_complex_1 );
                memcpy(v0, v1, 4 * sizeof ( double complex ) );
                tau=tau+dtau;
            }

        fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );
    }
printf("Completed");
fclose(f1);

在时间迭代结束时,我将频率波分复用的值和位移x=v12的最后值保存在一个文件中,然后继续用另一个频率进行时间迭代。因此,我的文件包含频率响应。

代码语言:javascript
运行
复制
fprintf(f1, "%g, %g \n", wdm/(2*3.142), cabs(v1[2]) );

我使用了来自people.sc.fsu.edu/~jburkardt/c_src/rk4/rk4.html的runge (rk4.c),并使用以下方法对其进行了修改,以实现复杂的数据类型

代码语言:javascript
运行
复制
#include <complex.h>

以下是runge-kutta-4必须解决的函数:

代码语言:javascript
运行
复制
/******************************************************************************/

double complex *rk4vec_f_ameya_complex_1 ( double t, int n, double complex u[] )

/******************************************************************************/

{
    double complex drive_m;
    double complex drive_c;
    double x;
    double xrf0_1;
    double complex *uprime;
    uprime = ( double * ) malloc ( 7 * sizeof ( double complex ) );

    //Check if memory unavailable
    if(uprime==NULL){
        printf("No memory available \n");
        return 0;
    }

    ///////////////////Second Order////////////////////////
    xrf0_1=xrf0*(1-exp(-0.2*t));
    drive_m=(xrf0*cexp(I*((u[6]-wm)/gammac)*t)/(2*wm*gammac));
    uprime[2]=u[3];
    uprime[3]=(wm/gammac)*(drive_m-u[3]*(2*I+2*gammam/wm)-u[2]*(2*I*gammam/gammac));

    return uprime;
    free(uprime);
}

如果我使用malloc()导致内存不足,请建议任何解决方案。

EN

回答 1

Stack Overflow用户

发布于 2016-09-11 05:58:46

一个明显的问题是,您在从uprime返回后释放了rk4vec_f_ameya_complex_1,我希望您得到一个无法到达的代码警告。而且,由于uprime的大小总是相同的,那么为什么要使用malloc呢?如果您只是将其设置为大小为7的数组,那么就不会出现malloc问题,您的代码可能会运行得更快。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39426769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档