难以理解的分割错误与c++

Unintelligible Segmentation Fault with C++

本文关键字:错误 c++ 分割      更新时间:2023-10-16
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];"有趣"的事情是,如果我用,比如说,2代替Ssin[k1][k2][k3]*Ssin[k1][k2][k3] + Scos[k1][k2][k3]*Scos[k1][k2][k3],它工作。

,请帮助!

注:: x_SkUpdate_Structure_Factor方法所属类的成员

您在这里的堆栈上放置了大量的数据—Ssin和Scos各约14MB。虽然不知道您正在使用哪个c++编译器或目标硬件,但我认为与堆栈滥用有关的事情是合理的猜测。几乎可以肯定,最好将这些数组设置为静态(线程不安全)或从堆中分配。

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

好的,我找到了一种不使用static关键字而使代码工作的替代方法。我只是采样了k1k2k3的一半,即使它们仍然覆盖了我感兴趣的整个领域(即ik从0到65)。这样,我没有得到分割错误的错误,但程序在合理的时间内工作。