Ubuntu机器上的分段错误但不是Mac上的分段错误

时间:2013-12-05 01:33:14

标签: c++

正在Mac机器上进行作业并且代码编译,我得到了我预期的输出。一旦我在Ubuntu机器上测试程序运行以进行评分,我就会收到Segmentation fault(core dumped)错误消息。我真的很难过,我正在寻找调试为什么会在ubuntu机器(版本12.04)而不是mac机器(mavericks OS)上进行调试的一些提示。

编辑:通过gdb运行我在

处遇到分段错误
in getPath: line 28, if (path[position] == 0 && position == 0) {

我的代码如下:

#include <iostream>

using namespace std;

int minDistance(int distance[], bool shortestPath[]) {

    int min = 1000000000;
    int indexOfMin;

    for (int i = 0; i < 6; i++) {
        if (shortestPath[i] == false && distance[i] <= min) {
            min = distance[i]; 
            indexOfMin = i;
        }
    }

    return indexOfMin;
}

void getPath(int path[], int position) {
    cout << position + 1 << " <- ";

    // base case, we hit the end of the path
    if (path[position] == 0 && position == 0) {
        cout << path[position] + 1 << endl;
    }
    else if (path[position] == 0)
        cout << path[position] + 1 << endl;
    else {
        getPath(path, path[position]);
    }
}

void dijkstraAlgorithm(int weightedGraph[6][6], int sourceVertex) {
    int distance[6];     
    bool shortestPath[6]; 
    int path[6]; 

    for (int i = 0; i < 6; i++) {
        distance[i] = 1000000000; 
        shortestPath[i] = false;
    }

    distance[sourceVertex] = 0;

    for (int j = 0; j < 5; j++) {
        int min = minDistance(distance, shortestPath);
        shortestPath[min] = true;
        for (int k = 0; k < 6; k++) {
            if (!shortestPath[k] && weightedGraph[min][k] && distance[min] != 1000000000 && distance[min] + weightedGraph[min][k] < distance[k]) {
                distance[k] = weightedGraph[min][k] + distance[min];
                path[k] = min;
            }
        }
    }

    cout << "Distance       Path" << endl;
    for (int i = 0; i < 6; i++) {
        // dist[i] == 0 a formatting fix for first distance
        if (distance[i] == 0) {
            cout << distance[i] << ":            ";
            getPath(path, i);
        }
        else {
            cout << distance[i] << ":           ";
            getPath(path, i);
        }
    }
}

int main() {
    int weightedGraph[6][6] = {
        {0, 10, 0, 30, 100, 0},
        {0, 0, 50, 0, 0, 0},
        {0, 0, 0, 0, 10, 5},
        {0, 0, 20, 0, 0, 15},
        {0, 0, 0, 60, 0, 0},
        {0, 0, 0, 0, 0, 0}
    };

    dijkstraAlgorithm(weightedGraph, 0);

    return 0;
}

注意:我需要在Ubuntu环境中使用g ++编译器(版本4.6.4)

2 个答案:

答案 0 :(得分:2)

valgrind下运行示例代码会显示以下uninitialized read错误:

==25442== Conditional jump or move depends on uninitialised value(s)
==25442==    at 0x4008B2: getPath(int*, int) (crash.cpp:24)
==25442==    by 0x400B19: dijkstraAlgorithm(int (*) [6], int) (crash.cpp:62)
==25442==    by 0x400B9C: main (crash.cpp:81)

==25442== Conditional jump or move depends on uninitialised value(s)
==25442==    at 0x4008F8: getPath(int*, int) (crash.cpp:27)
==25442==    by 0x400B19: dijkstraAlgorithm(int (*) [6], int) (crash.cpp:62)
==25442==    by 0x400B9C: main (crash.cpp:81)

等。

不要假设这些数组将使用零(0)自动初始化:

int distance[6];
bool shortestPath[6];
int path[6];

初始化这些数组,你将消除一些问题(至少)。

请参阅Initialization of a normal array with one default value

已更新:为什么它在Mac上有效可能只是巧合,如答案所述 Turn off automatic initialization of variables in Xcode

答案 1 :(得分:0)

如果你做的事情不好(调用未定义的行为),那么应用程序可以在一个操作系统上运行而不在另一个操作系统上运行。对于C和C ++,可能导致未定义行为的事物列表很大......但在您的情况下,它可能是一个超出范围的内存访问。

要在linux上调试它,我会通过valgrind运行应用程序,它将告诉你何时进行第一次无效访问(而不是崩溃你的代码 - 可能不是第一次。)。

如果您遇到OS X,我首先通过静态分析器运行代码,该分析器是XCode的一部分。它有时会警告你有关愚蠢的访问。然后我会看看使用malloc调试工具来帮助您缩小无效访问范围。 “man malloc”将为您提供可用环境变量的列表。