调用函数时出现分段错误

时间:2010-01-22 14:50:24

标签: c++ segmentation-fault

调用Update_Multiplier和gdb调试器时出现分段错误:

  

编程接收信号SIGSEGV,分段故障。   Update_Multiplier()()

中的0x080b74e8
double upperbound = 116325;
double objective = 1.1707e+07;
int main()
{
    Update_Multiplier();
}
void Update_Multiplier()
{
    cout << "function 0" << endl;
    // Determine subgradient vectors
    double gra[1000][1000];
    double grb[1000][1000];
    double dumX = 0;
    double stepsize[1000][1000];
    double tuning=2;
    double LRADum[1000][1000];
    double LRBDum[1000][1000];

    cout << "function 1" << endl;
    // update subgradient vectors
    for (int i=1; i<=noOfNodes; i++)
    {
        for (int j=1; j<=noOfNodes; j++)
        {
            if (C[i][j] != 0)
            {
                dumX=0;
                for (int p=1; p<=noOfCommodity; p++)
                {
                    dumX += X[i][j][p];
                }
                gra[i][j]=dumX-U[i][j]*Y[i][j]-Q[i][j];
                grb[i][j]=Q[i][j]-B[i][j]*Y[i][j];
            }
        }
    }

    // update stepsize
    cout << "function 2" << endl;
    for (int i=1; i<=noOfNodes; i++)
    {
        for (int j=1; j<=noOfNodes; j++)
        {
            if (C[i][j] != 0)
            {
                stepsize[i][j]=(tuning*(UpperBound-Objective))/sqrt((gra[i][j]*gra[i][j])*(grb[i][j]*grb[i][j]));
                LRADum[i][j]=LRA[i][j]+stepsize[i][j]*gra[i][j];
                LRA[i][j]=LRADum[i][j];
                LRBDum[i][j]=LRB[i][j]+stepsize[i][j]*grb[i][j];
                LRB[i][j]=LRBDum[i][j];

            }
        }
    }

}

8 个答案:

答案 0 :(得分:7)

我在你的代码中看到两个可疑的东西。

首先,你占用了太多的堆栈空间(约40 MB) 其次,你将数组的索引从1开始,它应该是0:

for (int i=1; i<=noOfNodes; i++)

将其更改为:

for (int i=0; i<noOfNodes; i++)

答案 1 :(得分:3)

猜测,你有一个堆栈溢出!您无法在堆栈上可靠地创建巨大的数组。您需要动态或静态地创建它们。

答案 2 :(得分:3)

您在哪里定义noOfNodes?这个的初始值是多少?或者,你从控制台读到这个吗?如果这是未初始化的,它可能有垃圾数据 - 这可能会或可能不会解释崩溃。

答案 3 :(得分:2)

你需要一个至少40兆字节的堆栈才能运行这个功能,因为你要分配五个数组,每个数组包含一百万个八字节双精度数。

更改函数以使用new从堆中分配双数组。

答案 4 :(得分:1)

你应该给我们整个代码,例如noOfNodes没有在任何地方定义。

只是在黑暗中刺伤:你的指数(Ci)从j变为1,你可能会溢出noOfNodes吗? / p>

答案 5 :(得分:0)

首先,尼尔说的是真的。

其次,C和C ++数组从索引0开始。如果你宣布

int a[100]; // 100 elements, from zeroth to ninety-ninth.

然后它的元素是a[0]a[1] ... a[99]

答案 6 :(得分:0)

我看不出这个代码有什么问题,但是:如果noOfNodes是1000,你可能会有一个一个错误。

请记住,数组是0索引的,因此您必须在执行时访问索引0 - 999而不是1 - 1000

答案 7 :(得分:-1)

我也有这个问题,我的函数返回了std :: string现在我只是引用了这样的dreturn类型void:

void readOnDicoFile(std::ifstream file/*If you have "using namespace std;" instruction, put ifstream, not std::ifstream (you can put both)*/)

及之前:

std::string readOnDicoFile(std::string fileName/*If you have "using namespace std;" instruction, put ifstream, not std::ifstream (you can put both)*/)