分段故障数据类型

时间:2011-11-22 11:46:26

标签: c++ types segmentation-fault

我试图得到一个数学结果,但我继续得到一个分段错误,分段错误发生在“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;

2 个答案:

答案 0 :(得分:0)

我认为你的内存损坏行

Ei = LJ[itr] + Ei;

在执行cout获取位置时会生成段错误。

答案 1 :(得分:0)

更新:您已更新LJ的定义,因此不再是此问题。 既然这是c ++,你为什么要使用循环和索引?更好(如:更安全)的解决方案是使用标准库算法,尤其是accumulate。 通过这样做,您将获得清晰度可能删除段错误的来源。

除非其他要求限制您,否则您应该遵循Scott Meyer的advice优先于循环算法。

第二次更新,整个代码可用:您必须确保只访问正确分配的内存位置。所以:

  1. 确保h初始化为零且
  2. 你永远不会写到[210]及更高版本。
  3. 更好的是,删除所有那些神奇的数字,而不是210使用k_max *(j_max - 1)并定义

    const unsigned int k_max = 15;
    const unsigned int j_max = 15;
    

    使用std :: vector而不是数组,这将为您处理内存分配。

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