具有大型数组的分段错误(核心转储)

时间:2014-07-09 16:58:24

标签: 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时,不会抛出错误并且程序按预期执行。我知道问题在于分配给我的物理内存,但有没有办法绕过它?有人可以指导一下我需要带哪些修改吗?

3 个答案:

答案 0 :(得分:2)

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

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

ulimit -s 32000

修复问题。但是将16Mb数据块放在堆栈上并不是一个好主意。

如果你将它们从堆栈中移出(并使用一些空行以使代码更易于阅读:))那么它可以正常工作。但是,如上所述,我还建议你看一下 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);
}

答案 1 :(得分:1)

保罗R是对的。函数内声明的变量使用“堆栈”。对局部变量可以使用多少空间。

他建议将那些本地数组声明全局,静态,动态分配意味着这些变量不会使用堆栈空间。使用STL中的矢量也可以。

此链接可以让您了解堆栈空间大小。

https://stackoverflow.com/a/1825996/3813353

一个快速而肮脏的解决方案是使用limit / ulimit。缺点是您必须在运行程序之前使用此命令。简单地使阵列全局变得更容易......

通常,当您遇到堆栈大小问题时,您是否有失控或无限递归。每次调用递归函数都可能不会使用堆栈中的大量数据,但如果函数不断调用自身,那么最终会耗尽堆栈空间。

答案 2 :(得分:1)

确实,你在堆栈上有太多的数据。

您可以使用std::vector标准模板类(即使您在堆栈上分配向量,其数据也在堆中)。因此,将#include <vector>添加到包含的标题中,然后编写

之类的代码
  std::vector<double> v1, v2;
  v1.push_back(2.512);
  v1.push_back(3.17);
  v2.resize(37);
  v2[0] = v1[0] + v1[1]; 
  v2[17] = sqrt(10.0) + 11.0;

阅读一些STL tutorial;顺便说一下,使用和学习C ++ 11(不是早期的C ++标准)。因此,使用最新的编译器(例如GCC 4.9,使用g++ -std=c++11 -Wall -g编译它....)并使用gdb调试器。