C++ 分段故障数据类型

C++ 分段故障数据类型,c++,types,segmentation-fault,C++,Types,Segmentation Fault,我试图得到一个数学结果,但我不断地得到一个分段错误,分段错误发生在“cout”线上。我认为r[]数组或LJ[]数组中没有任何错误 for (k = 0; k < 15; k++) { for (i = 0; i < 15; i++) { if (i == k) { NULL; } else

我试图得到一个数学结果,但我不断地得到一个分段错误,分段错误发生在“cout”线上。我认为r[]数组或LJ[]数组中没有任何错误

   for (k = 0; k < 15; k++)
    {
        for (i = 0; i < 15; i++)
        {
            if (i == k)
            {
                NULL;
            }
            else
            {
                //Use the 3D distance formula
                term1 = fabs(x[k] - x[i]);
                term1 = pow(term1, 2);
                term2 = fabs(y[k] - z[i]);
                term2 = pow(term2, 2);
                term3 = fabs(z[k] - z[i]);
                term3 = pow(term3, 2);
                result = term1 + term2 + term3;
                result = sqrt(result);
                r[h] = result;                      //Store the result in an array
                h++;
            }
        }
    }




    //Calculate Lennard-Jones potential of every pair
    for(itr = 0; itr < 210; itr++)
    {
        term1 = pow(r[itr], 12);
        term1 = 1/term1;
        term2 = pow(r[itr], 6);
        term2 = 2/term2;
        LJ[itr] = term1 - term2;
    }

    double Ei;

    for(itr = 0; itr < 210; itr++)
    {
        Ei = LJ[itr] + Ei;
    }
    Ei = Ei/2;
    cout << "The new Energy level " << Ei << endl;
(k=0;k<15;k++)的

{
对于(i=0;i<15;i++)
{
如果(i==k)
{
无效的
}
其他的
{
//使用三维距离公式
term1=fabs(x[k]-x[i]);
term1=功率(term1,2);
term2=fabs(y[k]-z[i]);
term2=功率(term2,2);
term3=fabs(z[k]-z[i]);
term3=功率(term3,2);
结果=第1条+第2条+第3条;
结果=sqrt(结果);
r[h]=result;//将结果存储在数组中
h++;
}
}
}
//计算每对的Lennard-Jones势
对于(itr=0;itr<210;itr++)
{
term1=功率(r[itr],12);
term1=1/term1;
term2=功率(r[itr],6);
term2=2/term2;
LJ[itr]=第1项-第2项;
}
双Ei;
对于(itr=0;itr<210;itr++)
{
Ei=LJ[itr]+Ei;
}
Ei=Ei/2;

难道我认为你的记忆有问题吗

Ei = LJ[itr] + Ei;

当执行cout-get-place时,会生成segfault。

更新:您已经更新了LJ的定义,因此这不再是问题所在。 既然是C++,为什么要使用循环和索引呢?更好的(比如:更安全的)解决方案是使用标准库算法,尤其是。 通过这样做,您将获得清晰性,并可能消除故障源

除非有其他需求约束您,否则您应该遵循Scott Meyer的算法优于循环

第二次更新,全部代码可用:您必须确保只访问正确分配的内存位置。因此:

  • 确保h初始化为零,并且
  • 你从来没有写信给r[210]或更高 更好的是,删除所有这些神奇的数字,而不是使用k_max*(j_max-1)和定义

    const unsigned int k_max = 15;
    const unsigned int j_max = 15;
    
    使用std::vector而不是数组,这将为您分配内存


    打印h和itr的值(或使用调试器,这是一个非常有用的工具)将向您显示访问未保留内存的位置。

    seg故障肯定不在
    cout
    行中(除非您对
    cout
    做了非常非常糟糕的事情,我无法想象:D)。
    LJ
    是如何定义的?那么还有其他一些东西。粘贴更多代码。可能是
    双Ei未正确初始化?=><代码>双Ei=0
    @DracoAter-这将打印垃圾,但不会导致seg-fault。请尝试使用编译器的最高警告级别(哪一个?)。这有助于识别可疑代码。@Josh-这不是添加,而是访问
    LJ[itr]
    。在这种情况下,内存损坏是int LJ[itr],而不是执行+运算符。所以我猜你是在LJ数组之外写数据的。好的,检查一下累加,因为问题可能是你在第一个循环中计算了太多或太少的元素。所以:sidestep循环(或者加倍确保边界正确)。只是一个问题,当我“push_back”时,我是否必须指定从哪里推,因为出于某种原因,当我将LJ声明为210的向量时,它开始从210推到211推到212,当使用向量使用at()而不是操作符[]时也是如此检查向量的边界。尤其是在调试时。如果边界检查结果过于昂贵,您可以稍后删除它。如果您像std::vector v(210)一样构造向量,那么您正在构造一个包含210个空初始化双精度的向量。所以push_back将从211开始添加。你可以做:std::vectorv;v、 储备金(210);然后把你的物品推回去。你知道为什么我这样做时会得到0吗:Ei=accumulate(LJ.begin(),LJ.end(),0);