分割故障c++

Segmentation Fault C++

本文关键字:c++ 故障 分割      更新时间:2023-10-16

输入格式为

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的线是图的边。第一个和第二个数字是顶点,第三个数字是它们之间的边的距离。试图读取数据并将边存储到该顶点的邻接列表中的位置。这个例子将创建一个有5个顶点的图,这些顶点的边从1到2。2到4&3&1等

我在输入四个数字后得到分割错误。错误发生在myGraph.vertexInfo[p1]线上。邻接->顶点=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;
}

您没有遵循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];
}

让我们看看adjacency是什么:

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

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

typedef ListCell* List;

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

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

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

旁注:您似乎将adjacency视为链表。但是,您应该注意到adjacency是指向链表中节点的指针。同样,现在是学习std::list的好时机。

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

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

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);
    }
}