2015-11-02 64 views
0

我已经为图邻接矩阵编写了下面的代码,但是得到了segementation错误。我认为这是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

什么是输入? –

+0

5和4.只要我输入这个,就有分段错误。 – RaviTej310

+0

你为什么认为这是malloc声明?你有没有调试过它? –

回答

2

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

分配整数的一维平面阵列是应该o按下指针为整数的数组的指针。 (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); 
} 

你也应该执行,他顶点用户输入实际邻接矩阵。

0

所以调试代码(你应该张贴我想之前已经做了),当我得到这个:

计划接收信号SIGSEGV,分割过错。

在test.c的0x0000000100000e12在adjMatrix():23 23

G->形容词[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回溯它,例如