分割故障,程序工作正常
Segmentation Fault, program works fine
我正在实现最小生成树问题的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<<"EdgetWeight"<<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
谁能解释为什么我得到这个错误?
您不为图形类的' adj '矩阵成员的行分配内存。这是最有可能的坠机原因。这可能会有帮助。
我的理解是程序运行是偶然的/因为adj数组很小。
问题可能是由于对堆栈分配的数组(adjmat和/或Graph::adj)的不正确访问引起的。由于这些数组是在堆栈上分配的,不正确的访问可能会损坏存储在那里的其他数据(如函数返回地址或其他变量),这可能会在调用析构函数或使用无效返回地址时导致分段错误。
相关文章:
- 以螺旋方式打印矩阵的程序.(工作不好)
- 我的评分程序无法正常工作
- 如何解决在负数的情况下程序以相同方式工作的问题?
- 如何使实例化在我的 OpenGL 程序中工作?
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 有没有办法在RCPP程序无法正常工作时阻止RGui崩溃?
- cout 在我的程序上无法正常工作,有人可以帮助我吗?
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- 程序在CLion IDE中工作,但exe不起作用
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 为什么使用 exec() 重新启动程序不能正常工作?
- 使用程序生成来创建磁盘,但纹理无法正常工作
- 我无法让我的程序工作,我一直得到未定义的符号:C
- 所有Visual Studio安装程序崩溃,可视化构建工具也无法正常工作
- 名为DLL的C++windows服务程序工作不正常
- .exe应用程序在windows10中创建新模块时抛出错误,但在windows7中工作正常
- O2优化水平中断程序工作
- 从书本中学习C++无法使该程序与类一起工作
- r-工作程序中对自定义函数的未定义引用(C++和RcppParallel)
- 带有 Allegro 5 的工作程序不再起作用