【问题标题】:Graph adjacency matrix segmentation fault图邻接矩阵分割错误
【发布时间】:2015-11-02 08:42:01
【问题描述】:

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

【问题讨论】:

  • 5 和 4。只要我输入这个,就会出现分段错误。
  • 为什么你认为是 malloc 语句?你调试过吗?
  • 没有。但我看不到任何其他有问题的代码段。而分段错误通常是由于内存分配错误引起的吧?

标签: c data-structures graph


【解决方案1】:

这个:

G->adj=malloc(sizeof(1)*((G->V) * (G->V)));

分配一个整数的一维平面数组给一个指针,该指针应该保存一个指向整数的指针数组。 (sizeof(1)sizeof(int)相同。)

如果您想以G-&gt;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);
}

您还应该强制用户输入的顶点实际上在邻接矩阵的范围内。

【讨论】:

    【解决方案2】:

    所以在调试你的代码时(我猜你应该在发布之前做些什么)我明白了:

    程序收到信号SIGSEGV,分段错误。

    0x0000000100000e12 in adjMatrix () at test.c:23 23

    G->adj[u][v]=0;

    第23行对应这行G-&gt;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 回溯它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多