分段故障C ++

时间:2014-03-19 22:11:15

标签: c++ graph segmentation-fault

输入格式如下

5
1 2  9.0
1 3 12.0
2 4 18.0
2 3  6.0
2 5 20.0
3 5 15.0
0
1 5

第一个数字是图表中的顶点数。然后下一行最多为0是图的边缘。第一个和第二个数字是顶点,第三个数字是边缘在它们之间的距离。尝试读取数据并将边缘存储到该顶点的List邻接中的位置。此示例将生成具有五个顶点的图形,其边缘为1到2& 3。 2至4& 3& 1等

输入四个数字后,我收到了分段错误。故障发生在线myGraph.vertexInfo [p1] .adjacency - >顶点= P2;哪里开始尝试存储信息。为什么我会遇到这个错误?

#include <cstdio>
using namespace std;

struct ListCell
{
   ListCell* next;
   int vertex;
   double weight;

   ListCell(int v, double w, ListCell* nxt)
   {
      vertex = v;
      weight = w;
      next = nxt;
   }
};

typedef ListCell* List;

struct Vertex
{
   bool signaled;
   long distance;
   List adjacency;    
};

struct Graph
{
   int     numVertices;
   Vertex* vertexInfo;

   Graph(int n)
   {
      numVertices = n;
      vertexInfo  = new Vertex[n+1];
      for(int i = 1; i <= n; i++)
      {
         vertexInfo[i].signaled = false;
      }
   }
};

//==============================================================
//                   readIn
//==============================================================
// 
//==============================================================

void readIn()
{
   int g;
   int p1;
   int p2;
   float edge;
   scanf("%i ", &g);

   Graph myGraph(g);
   scanf("%i", &p1);
   while(p1 != 0)
   {
      scanf("%i", &p2);
      scanf("%f", &edge);         
      myGraph.vertexInfo[p1].adjacency -> vertex=p2; 
      myGraph.vertexInfo[p2].adjacency -> vertex=p1;
      myGraph.vertexInfo[p1].adjacency -> weight=edge; 
      myGraph.vertexInfo[p2].adjacency -> weight=edge;
      scanf("%i", &p1);
   }
}
//==============================================================
//                   main
//==============================================================

int main(int argc, char** argv)
{
   readIn();
   return 0;
}

4 个答案:

答案 0 :(得分:1)

您没有遵循Vertex的对象构造和初始化的一些基本原则。

构造Vertex的实例时,没有任何关于成员数据值的可预测信息。我建议添加一个默认构造函数,将成员数据初始化为理智的东西。

struct Vertex
{
   Vertex() : signaled(false), distance(0), adjacency(NULL) {}

   bool signaled;
   long distance;
   List adjacency;    
};

一旦你这样做,Graph的构造函数可以简化为:

Graph(int n) : numVertices(n)
{
    vertexInfo  = new Vertex[n+1];
}

答案 1 :(得分:0)

adjacency指针未初始化,因此在解除引用时会遇到问题。

答案 2 :(得分:0)

您必须初始化您的邻接成员:

Graph(int n)
{
    numVertices = n;
    vertexInfo  = new Vertex[n+1];
    for(int i = 1; i <= n; i++)
    {
        vertexInfo[i].signaled = false;
        vertexInfo[i].adjacency = new ListCell(i, 0.0, 0);
    }
}

答案 3 :(得分:0)

让我们来看看adjacency是什么:

struct Vertex
{
   bool signaled;
   long distance;
   List adjacency;    
};

现在让我们来看看List是什么:

typedef ListCell* List;

因此,adjacency实际上是指向ListCell的指针。没关系,我们可以解决这个问题。但在我们可以之前,我们必须确保adjacency实际指向某事。那么问题就变成了代码中adjacency指向的内容了?

答案是:谁知道?你从来没有把它指向任何东西,所以它随机指向某个地方。当你试图写入一些随机的内存区时会发生什么?好吧,如果你幸运,你会崩溃。

那么,你如何解决这个问题呢?简单:正确初始化和操作adjacency。您可能希望研究C ++中的动态内存分配和标准库,它提供了一个相当漂亮且有效的链表实现。

旁注:您似乎将adjacency视为链接列表。但是,您应该注意adjacency是指向链接列表中节点的指针。再次,现在是了解std::list的好时机。