分割故障c++
Segmentation Fault C++
输入格式为
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);
}
}
- 分段故障(堆芯转储)矢量
- C++中的动态铸造故障
- 数组的指针从不分段故障
- vscode g++链路故障:体系结构x86_64的未定义符号
- 访问被拒绝后,c++中的故障保护代码
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 调试 CUDA MMU 故障
- Geeksforgeeks C 程序故障排除:IEE 754 表示法为十进制
- Arch Linux.AUR 包 mysql 不能用 makepkg 构建.错误:构建 () 中出现故障
- 正在处理故障(堆芯转储)
- 在 Boost::fiber 中引发的BOOST_ASSERT故障 Visual Studio "Debug" 构建
- 如何进行故障排除:未定义对"非虚拟 thunk to ..."的引用
- C++函数过载会导致 SEG 故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 当新的故障时,是否有必要留出一些紧急内存?
- Python & C-C++ 扩展模块案例段故障
- 带升压的 SEG 故障::make_shared / 特征3 内存.h.
- 在 c++ 中,发生故障后是否需要 stream.clear()?
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串