c++ - 大型阵列的段错误(核心已转储)

标签 c++ linux core

<分区>

我是 C++ 编程新手,写过这段 C++ 代码:

//colpitts high freq 1 GHz working with delay
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
using namespace std;

const double pi = 3.1415926;

int main(){
    double c0, dx, dt,C1,C2,L,fs,Ceq, freq, tau, Rload, gload, Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ;
    c0=20000000000;
    dx=0.01;
    dt=dx/(2 * c0);
    cout<<dt<<"\n";
    double V1 [1000000]={};
    double V2 [1000000]={};
    V1[0]=1e-3; 
    C1=1e-12;
    C2=5e-12;
    L=30.4e-9;
    fs=4e12;
    Ceq=(C1 * C2)/(C1+C2);
    cout<<Ceq<<"\n";
    freq=1/(2 * pi * (sqrt(L*Ceq)));
    cout<<freq<<"\n";
    tau=1/freq;
    cout<<tau<<"\n";
    Rload=50;
    Re=1e6; 
    ge=1/Re;
    cout<<ge<<"\n";
    gm=0;
    gc1=(C1)/dt;
    cout<<gc1<<"\n";
    ic1=-((C1)/dt) * V1[0];  
    cout<<ic1<<"\n";
    gc2=(C2)/dt;
    cout<<gc2<<"\n";
    ic2=-((C2)/dt) * V2[0];
    cout<<ic2<<"\n";
    gl=dt/(L);
    cout<<gl<<"\n";
    il=gl * (V2[0]-V1[0]);
    cout<<il<<"\n";
    gload=1/Rload;
    cout<<gload<<"\n";
    return (0);
}

当我在 Linux 机器上运行它时,它会抛出段错误(核心已转储)的错误,但是当我将数组更改为 100000 时,不会抛出任何错误并且程序会按预期执行。我知道问题出在分配给我的物理内存上,但是有办法解决吗?有人可以指导我需要进行哪些修改吗?

最佳答案

就是堆栈。您正在使用大约 16Mb 的堆栈来存储这两个 double 组(每个 double 8 个字节 * 2 个数组 * 1,000,000)。

像这样设置一个更大的堆栈:

ulimit -s 32000

确实解决了问题。但是将 16Mb 的数据 block 放在堆栈上并不是一个好主意。

如果您像这样将它们移出堆栈(并使用一些空行使代码更易于阅读:)),那么它就可以正常工作。但是,如上所述,我还建议您查看 vector 而不是使用 C 风格的原始数组:

http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm

#include <iostream>
#include <cmath>
#include <string>
#include <cstring>

using namespace std;

const double pi = 3.1415926;


double V1 [1000000]={};
double V2 [1000000]={};


int main(){

    double c0, dx, dt,C1,C2,L,fs,Ceq;
    double freq, tau, Rload, gload; 
    double Re, ge,gm,gc1,gc2,ic1,ic2,il,gl ;
    c0=20000000000;
    dx=0.01;
    dt=dx/(2 * c0);
    cout<<dt<<"\n";

    V1[0]=1e-3; 
    C1=1e-12;
    C2=5e-12;
    L=30.4e-9;
    fs=4e12;

    Ceq=(C1 * C2)/(C1+C2);
    cout<<Ceq<<"\n";
    freq=1/(2 * pi * (sqrt(L*Ceq)));
    cout<<freq<<"\n";

    tau=1/freq;
    cout<<tau<<"\n";

    Rload=50;
    Re=1e6; 
    ge=1/Re;
    cout<<ge<<"\n";

    gm=0;
    gc1=(C1)/dt;
    cout<<gc1<<"\n";

    ic1=-((C1)/dt) * V1[0];  
    cout<<ic1<<"\n";

    gc2=(C2)/dt;
    cout<<gc2<<"\n";

    ic2=-((C2)/dt) * V2[0];
    cout<<ic2<<"\n";

    gl=dt/(L);
    cout<<gl<<"\n";

    il=gl * (V2[0]-V1[0]);
    cout<<il<<"\n";

    gload=1/Rload;
    cout<<gload<<"\n";

    return (0);
}

关于c++ - 大型阵列的段错误(核心已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24659611/

相关文章:

java - Windows 环境变量 NUMBER_OF_PROCESSORS 在 JVM 内外显示不同的值

php - 从 PHP Web 应用程序调用 C++ 库 : system() vs SWIG PHP extension?

c++ - 使用运算符 [] 时的 std::map 段错误

c++ - c 中的模运算符

javascript - 使用 Netlify 将环境变量导入 HTML

java - 如果java是平台无关的,一个系统中的静态变量内存分配到另一个系统?

c++ - 运算符重载,所有运算符的定义/ header

linux - 删除文件中包含字符串的文件 - Linux cli

node.js - 在同一端口上运行 3 个 Web 服务器

java - 如何生成给定语言/区域设置的随机字符串