图邻接矩阵分割故障

时间:2015-11-02 08:42:02

标签: c data-structures graph

我已经为图形邻接矩阵编写了以下代码,但是出现了分段错误。我认为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;
}

2 个答案:

答案 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(例如

)对其进行回溯