分段错误,程序运行正常

时间:2014-07-09 13:25:59

标签: c++ gdb segmentation-fault

我实现了Prim的最小生成树问题算法。程序工作正常,我得到了所需的输出,但我在结束时收到分段错误。我检查了我的程序错误,但程序没问题。

此处源代码

#include <iostream>
#include <cstdio>
#define INF 1000000
#define N 5

using namespace std;

class Graph
{
    int V;
    int adj[][N];

    public:
        Graph(int,int mat[][N]);
        void primsMST();
};

Graph::Graph(int v, int mat[][N])
{
   this->V = v;
   for(int i=0; i<v; i++)
   {
       for(int j=0; j<v; j++)
           adj[i][j] = mat[i][j];
   }
}

void Graph::primsMST()
{
    int i, j;

    int key[V];     // Key Value which is used to pick minimum weight vertex
    int parent[V];  // To store Tree
    bool mstSet[V];  // Mark Vertex included in MST

    // Initialize Key Values to infinite and mstSet to false
    for(i=0; i<V; i++)
    {
        key[i]=INF;
        mstSet[i] = false;
    }

    // Initialize initial vertex
    key[0] = 0;
    parent[0] = -1;

    int minm, min_i;
    for(int k=0; k<V-1; k++)
    {
        // Get min Key from all vertices
        minm = INF;
        for(i=0; i<V; i++) {
            if(!mstSet[i] && key[i]<minm)
            {
                minm = key[i];
                min_i = i;
            }
        }

        // Include min key vertex in MST
        mstSet[min_i] = true;

        // Update key values of vertices adjacent to min vertex
        for(j=0; j<V; j++)
        {
            if( adj[min_i][j] && !mstSet[j] && adj[min_i][j] < key[j])
            {
                key[j] = adj[min_i][j];
                parent[j] = min_i;
            }
        }
    }

    for(i=0; i<V; i++)
        cout<<i<<", "<<key[i]<<", "<<parent[i]<<endl;

    // Print Minimum spanning Tree
    cout<<"Edge\tWeight"<<endl;
    for(i=1; i<V; i++)
        cout<<i<<"--"<<parent[i]<<"\t"<<adj[i][parent[i]]<<endl;

    cout<<endl;
}

int main()
{

    int adjmat[][N] =  {{0, 2, 0, 6, 0},
                      {2, 0, 3, 8, 5},
                      {0, 3, 0, 0, 7},
                      {6, 8, 0, 0, 9},
                      {0, 5, 7, 9, 0},
                     };

    Graph g(N, adjmat);

    g.primsMST();

    cout<<endl;
    return 0;
}

使用gcc version 4.7.2编译程序。 当我运行这个程序时,我得到了图形的所需输出,但最后发生了分段故障。

$ ./primsMST
0, 0, -1
1, 2, 0
2, 3, 1
3, 6, 0
4, 5, 1
Edge    Weight
1--0    2
2--1    3
3--0    6
4--1    5

Segmentation fault

这是使用 gdb

的调试输出
$ gdb primsMST
GNU gdb (GDB) 7.4.1-debian
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/abhishek/myPrograms/geeksforgeeks/graphs/primsMST...done.
(gdb) set logging on
Copying output to gdb.txt.
(gdb) run
Starting program: /home/abhishek/myPrograms/geeksforgeeks/graphs/primsMST 
0, 0, -1
1, 2, 0
2, 3, 1
3, 6, 0
4, 5, 1
Edge    Weight
1--0    2
2--1    3
3--0    6
4--1    5



Program received signal SIGSEGV, Segmentation fault.
0x0000000000000002 in ?? ()
(gdb) backtrace
#0  0x0000000000000002 in ?? ()
#1  0x0000000800000003 in ?? ()
#2  0x0000000000000005 in ?? ()
#3  0x0000000000000003 in ?? ()
#4  0x0000000700000000 in ?? ()
#5  0x0000000800000006 in ?? ()
#6  0x0000000000000000 in ?? ()
(gdb) quit 

任何人都可以解释为什么我会收到此错误?

2 个答案:

答案 0 :(得分:1)

问题可能是由于对堆栈分配的数组(adjmat和/或Graph :: adj)的错误访问造成的。由于这些数组是在堆栈上分配的,不正确的访问可能会破坏存储在那里的其他数据(如函数返回地址或其他变量),这会在调用析构函数或使用无效返回地址时导致分段错误。

答案 1 :(得分:1)

您不为图表类的'adj'矩阵成员的行分配内存。这是坠机的最可能原因。 这可能有所帮助:This可能有所帮助。

我的理解是程序偶然运行/因为adj数组很小。