我已经为图形邻接矩阵编写了以下代码,但是出现了分段错误。我认为malloc语句有问题,但我不知道是什么。我该如何解决这个问题?
#include<stdio.h>
#include<stdlib.h>
struct Graph
{
int V;
int E;
int **adj;
};
struct Graph *adjMatrix()
{
int i,u,v;
struct Graph *G=(struct Graph*)malloc(sizeof(struct Graph));
printf("Enter vetrices and edge\n");
scanf("%d %d",&G->V,&G->E);
G->adj=malloc(sizeof(1)*((G->V) * (G->V)));
for(u=0;u<(G->V);u++)
{
for(v=0;v<(G->V);v++)
{
G->adj[u][v]=0;
}
}
for(i=0;i<(G->E);i++)
{
printf("Enter source vertces and dest vertix ");
scanf("%d %d",&u,&v);
G->adj[u][v]=1;
G->adj[v][u]=1;
}
return G;
}
int main()
{
struct Graph *T=adjMatrix();
printf("%d",T->adj[0][0]);
return 0;
}
答案 0 :(得分:2)
此:
G->adj=malloc(sizeof(1)*((G->V) * (G->V)));
将一维整数的整数数组分配给一个指针,该指针被认为是一个指向整数的指针数组。 (sizeof(1)
与sizeof(int)
相同。)
如果要以G->adj[u][v]
的形式访问矩阵,则必须为数组的两个维分配内存。一种方法是将一个指针数组分配给int,然后为每个指针分配int数组:
G->adj = malloc(sizeof(*G->adj) * G->V);
for (i = 0; i < G->V; i++) {
G->adj[i] = malloc(sizeof(*G->adj[i]) * G->V);
}
您还应该强制执行用户输入的顶点实际上在邻接矩阵的范围内。
答案 1 :(得分:0)
所以在调试你的代码时(我猜你应该做什么)我得到了这个:
编程接收信号SIGSEGV,分段故障。
0x0000000100000e12 in adjMatrix()at test.c:23 23
G-&GT;形[U] [V] = 0;
第23行对应此行G->adj[u][v]=0;
所以肯定有一个segfault
。这是由于您的malloc()
。你必须确实为这两个维度分配内存而不是:
G->adj = malloc(sizeof(*G->adj) * G->V);
for (i = 0; i < G->V; i++) {
G->adj[i] = malloc(sizeof(*G->adj[i]) * G->V);
}
有关如何调试代码的提示:
使用gcc -g
进行编译,然后运行gdb name_of_your_program
。发生segfault
时,您可以使用命令bt
(例如