C - 向图形添加边缘时出现分段错误

时间:2015-05-28 17:07:52

标签: c graph segmentation-fault edge adjacency-matrix

我必须为此程序使用无向加权图(邻接矩阵)。

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)运行

     

启动程序:/ home / mintroot / Desktop / media

     

5

     

0 5 3 2 2

     

编程接收信号SIGSEGV,分段故障。

     Add()

中的

0x00000000004007a4

使用此命令行编译程序:

  

gcc -std = c99 -Wall -pedantic -Werror -o media program.c -lm

我做错了什么,如何解决这个问题?谢谢,非常感谢。

1 个答案:

答案 0 :(得分:1)

您的初始化函数正在错误地初始化矩阵:

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 不是一个二维数组,而是指向一维数组的指针数组。您可以使用与真正的 2D阵列相同的语法来访问元素,但这对您来说实际上并不重要。

顺便提一下,@ Dave的道具,先前发布的,然后删除了相同的代码更正。

相关问题