C++ 为什么我的代码抛出SIGBUS错误,即使我在堆中存储变量?

C++ 为什么我的代码抛出SIGBUS错误,即使我在堆中存储变量?,c++,memory,segmentation-fault,heap-memory,C++,Memory,Segmentation Fault,Heap Memory,在天线类的方法plotThermalNoise()中,由于某种原因,for循环不会运行。最初,我对n和I使用int,但是我需要处理比int所能容纳的大得多的数字。所以,现在我使用了一个long int来表示两者。然而,该程序不再有效。我用GDB解决了这个问题,似乎我遇到了SIGBUS错误。我尝试使用new在堆中存储这两个变量,但是循环仍然没有运行 #define k 0.0000000000000000000000138064852 //Boltzmann's constant class A

天线
类的方法
plotThermalNoise()
中,由于某种原因,
for
循环不会运行。最初,我对
n
I
使用
int
,但是我需要处理比
int
所能容纳的大得多的数字。所以,现在我使用了一个
long int
来表示两者。然而,该程序不再有效。我用GDB解决了这个问题,似乎我遇到了SIGBUS错误。我尝试使用
new
在堆中存储这两个变量,但是循环仍然没有运行

#define k 0.0000000000000000000000138064852 //Boltzmann's constant

class Antenna{

    double _srate, _sdur, _res, _temp, _band;

    public:
        Antenna(double sampling_rate, double sample_duration, double resistance_ohms, double temperature_kelvin, double bandwidth_Hz){
            _srate = sampling_rate;     _sdur = sample_duration;
            _res   = resistance_ohms;   _temp = temperature_kelvin;
            _band  = bandwidth_Hz;
        }


        void plotThermalNoise();
};

void Antenna::plotThermalNoise(){

    //calculate RMS, mean of Gaussian
    double RMS =  sqrt(4 * _res * k * _temp * _band);
    double V   =  sqrt((4 * k * _temp * _band) / _res);

    long int n = _srate / _sdur;
    double x[*n],y[*n];
    
    gRandom->SetSeed(time(NULL));

    for(long int i = 0; i < n; ++i){

        x[i] = i;
        y[i] = gRandom->Gaus(V,RMS);

    }

    TGraph gr = new TGraph(n,x,y);
    gr->SetTitle("Thermal Noise Voltage vs Time Trace;Seconds;Volts");
    gr->Draw();

}

void dataAquisitionSim(){     

    Antenna test(4000000000, 0.000001, 50, 90, 500);
    test.plotThermalNoise();    

}
#定义k 0.0000000000000000138064852//Boltzmann常数
类天线{
双速率、双速率、双分辨率、双温度、双波段;
公众:
天线(双采样率、双采样持续时间、双电阻、双温度、双带宽){
_srate=采样率;\u sdur=采样持续时间;
_res=电阻\u欧姆;\u温度=温度\u开尔文;
_频带=带宽×赫兹;
}
热噪声();
};
空心天线::绘图热噪声(){
//计算均方根,高斯分布的平均值
双RMS=sqrt(4*分辨率*k*温度*波段);
双V=sqrt(4*k*温度*波段)/分辨率;
长整数n=\u srate/\u sdur;
双x[*n],y[*n];
gRandom->SetSeed(时间(空));
用于(长整数i=0;iGaus(V,RMS);
}
TGraph gr=新的TGraph(n,x,y);
gr->SetTitle(“热噪声电压与时间轨迹;秒;伏”);
gr->Draw();
}
void dataAquisitionSim(){
天线测试(40000000000.000001,50,90500);
测试图热噪声();
}
这段代码不会编译。我假设您的实际代码是:

通过传入的参数:
4000000000
用于
\u srate
0.000001
用于
\u sdur
n
变为
4000000000/0.000000,1==4000000000000000

然后尝试在堆栈上分配两个该大小的
double
数组。这些阵列的总大小为64 PB

最大的超级计算机拥有“超过10PiB的内存”。所以你只需要比这个大6倍的东西

我好像遇到了SIGBUS错误

这是你应该做的。一些后台计算应该可以帮助您认识到,代码编译并不意味着它会运行

即使我在堆中存储变量


除非你有一台内存超过64PiB的计算机,否则堆栈和堆是不相关的——这两者都会用完。

让我们看看,4E9除以1E-6得到4E15。要存储的整数太多了。
long int n=。。。;双x[*n],y[*n] -编译吗?考虑使用<代码> STD::vector < /代码>,而不是那些数组。然而,不幸的是,这似乎并不能解决问题。
    long int n = _srate / _sdur;
    double x[*n],y[*n];
    long int n = _srate / _sdur;
    double x[n],y[n];