使用C ++无法理解的分段错误

时间:2013-05-09 05:39:48

标签: c++ segmentation-fault

void Update_Structure_Factor ()
{
    double Ssin [121][121][121];
    double Scos [121][121][121];
    double kdotr;
    int ik;
    double Sk_  [66];
    int howmany [66];

    for ( int i=0; i<x_.size(); ++i )
    {
        for ( int k1=0; k1<=120; ++k1 )
        {
            for ( int k2=0; k2<=120; ++k2 )
            {
                for ( int k3=0; k3<=120; ++k3 )
                {
                    kdotr = (double)dQ*( (k1-60)*x_[i][0] + (k2-60)*x_[i][1] + (k3-60)*x_[i][1] );
                    Ssin[k1][k2][k3] += (double)sin(kdotr);
                    Scos[k1][k2][k3] += (double)cos(kdotr);
                }
            }
        }
    }

    for ( int k1=0; k1<=120; ++k1 )
    {
        for ( int k2=0; k2<=120; ++k2 )
        {
            for ( int k3=0; k3<=120; ++k3 )
            {
                double k = (double)dQ*sqrt( pow((k1-60),2) + pow((k2-60),2) + pow((k3-60),2) );
                ik = round(k/0.1);
                Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];
                ++howmany[ik];
            }
        }
    }

    for ( int i=0; i<66; ++i )
        Sk[i] += (double)Sk_[i]/howmany[i];
}

第34行导致了这个问题,即Sk_[ik] += Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3];“有趣”的事情是,如果我将Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3]替换为2,则可行。

请帮忙!

P.S。:x_Sk是此方法Update_Structure_Factor所属类的成员。

2 个答案:

答案 0 :(得分:1)

你在这里堆积了大量的数据--Ssin和Scos各占14MB。不知道你正在使用哪个C ++编译器或目标硬件,我仍然认为与堆栈滥用相关的东西是一个合理的猜测。你几乎肯定会让这些数组静态(线程不安全)或从堆中分配。

不相关,但C ++不会自动为您初始化堆栈变量。您的代码假设数组以零开头。使数组静态实际上第一次执行0 init,但是你必须在每次调用时再次清除它们。

答案 1 :(得分:0)

好的,我找到了另一种方法,可以在不使用static关键字的情况下使代码正常工作。我只是对k1k2k3的一半进行了采样,即使它们仍然覆盖了我感兴趣的整个域(例如,ik从0到65)。这样,我没有获得分段错误错误,但程序在合理的时间内工作。