向图形添加边时出现分段错误
Segmentation fault when adding edge to graph
我必须为此程序使用无向加权图(邻接矩阵)。
typedef struct graph {
int n; /* Number of vertices */
Boolean *visited; /* Will be later used */
double **mat; /* It has to be a double */
} Graph;
用于初始化图形的函数:
void InitializeGraph(Graph* g, int max) {
int i;
g->visited = malloc(max * sizeof(Boolean));
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat = calloc(max, sizeof(double));
g->n = max;
}
现在我只是想在我的图表中添加一条边,但由于某些奇怪的原因它不起作用,我也不知道为什么。这是我尝试使用的函数:
void Add(Graph *g, int v1, int v2, double weight){
g->mat[v1][v2] = weight;
g->mat[v2][v1] = weight;
}
下面是我的程序如何读取输入以及它如何调用函数 Add()。根据我的测试,读数似乎工作正常。
Graph g;
int i, j, aux;
double daux;
scanf("%d%*c", &aux); /* This is the number of vertices */
InitializeGraph(&g, aux);
for(i = 0; i < g.n; i++){
for(j = 0; j < g.n; j++){
scanf("%lf%*c", &daux);
Add(&g, i, j, daux);
}
}
运行 gdb 上的程序,显示如下:
(gdb) run
Starting program: /home/mintroot/Desktop/media
5
0 5 3 2 2
Program received signal SIGSEGV, Segmentation fault.
0x00000000004007a4 in Add ()
使用此命令行编译程序:
gcc -std=c99 -Wall -pedantic -Werror -o media program.c -lm
我做错了什么,我该如何解决?
您的初始化函数错误地初始化了矩阵:
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat = calloc(max, sizeof(double));
请注意,循环的每次迭代都将结果指针记录在相同(错误)的位置:g->mat
。最快的修复方法是:
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat[i] = calloc(max, sizeof(double));
请注意,您的 mat
不是 二维数组,而是指向一维数组的指针数组。不过,您可以通过与 真正的 二维数组相同的语法来访问元素,因此这对您来说可能并不重要。
顺便说一句,支持@Dave,他之前发布并删除了相同的代码更正。
我必须为此程序使用无向加权图(邻接矩阵)。
typedef struct graph {
int n; /* Number of vertices */
Boolean *visited; /* Will be later used */
double **mat; /* It has to be a double */
} Graph;
用于初始化图形的函数:
void InitializeGraph(Graph* g, int max) {
int i;
g->visited = malloc(max * sizeof(Boolean));
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat = calloc(max, sizeof(double));
g->n = max;
}
现在我只是想在我的图表中添加一条边,但由于某些奇怪的原因它不起作用,我也不知道为什么。这是我尝试使用的函数:
void Add(Graph *g, int v1, int v2, double weight){
g->mat[v1][v2] = weight;
g->mat[v2][v1] = weight;
}
下面是我的程序如何读取输入以及它如何调用函数 Add()。根据我的测试,读数似乎工作正常。
Graph g;
int i, j, aux;
double daux;
scanf("%d%*c", &aux); /* This is the number of vertices */
InitializeGraph(&g, aux);
for(i = 0; i < g.n; i++){
for(j = 0; j < g.n; j++){
scanf("%lf%*c", &daux);
Add(&g, i, j, daux);
}
}
运行 gdb 上的程序,显示如下:
(gdb) run
Starting program: /home/mintroot/Desktop/media
5
0 5 3 2 2
Program received signal SIGSEGV, Segmentation fault.
0x00000000004007a4 in Add ()
使用此命令行编译程序:
gcc -std=c99 -Wall -pedantic -Werror -o media program.c -lm
我做错了什么,我该如何解决?
您的初始化函数错误地初始化了矩阵:
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat = calloc(max, sizeof(double));
请注意,循环的每次迭代都将结果指针记录在相同(错误)的位置:g->mat
。最快的修复方法是:
g->mat = calloc(max, sizeof(double*));
for (i = 0; i < max; i++)
g->mat[i] = calloc(max, sizeof(double));
请注意,您的 mat
不是 二维数组,而是指向一维数组的指针数组。不过,您可以通过与 真正的 二维数组相同的语法来访问元素,因此这对您来说可能并不重要。
顺便说一句,支持@Dave,他之前发布并删除了相同的代码更正。