2013-10-27 4 views
0

Ниже приведен код кода C, который содержит график :. Код вызывает ошибку сегментации после выполнения. Я попытался отладить программу, используя gdb и установив точку останова перед первой операцией malloc. Значение буфера перед операцией malloc равно 0x00 ..... Как я могу преодолеть эту проблему и почему это происходит ?Почему ядро ​​сегментации сбрасывается во время выполнения этого фрагмента c

#include<stdio.h> 
#include<malloc.h> 
typedef struct graph 
{ 
int v; 
int e; 
int **adj; 
}graph; 

int main() 
{ 

int i,u,v; 
    graph *g=(graph*)malloc(sizeof(graph)); // first malloc call 
    scanf(" %d %d",&(g->v),&(g->v)); 

    g->adj=malloc(sizeof((g->v)*(g->v))); 


    for(u=0;u<(g->v);u++) 
     { 
      for(v=0;v<(g->v);v++) 
      g->adj[u][v]=0; 
     } 
    printf(" Enter input"); 

     for(i=0;i<(g->e);i++){ 
      scanf("%d %d",&u,&v); 
      g->adj[u][v]=1; 
      g->adj[v][u]=1; 

      } 
printf("print matriix "); 

    for(u = 0; u<(g->v); u++) { 

     for(v = 0; v<(g->v) ; u++) 
     printf("%d",(g->adj[u][v])); 
     printf("\n"); 
    } 


return 0; 
} 
+0

Почему бы вам не использовать calloc? то вам не нужно инициализировать до 0 –

+0

@ChristianTernus ОК, это лучше. – Kevin

+0

@ Kevin Расширяемый код форматирования расширений. Постарайтесь использовать его. –

ответ

0

scanf(" %d %d",&(g->v),&(g->v));
g->adj=malloc(sizeof((g->v)*(g->v)));

Эти линии не выглядят хорошо. Возможно, одним из выражений должно было быть g->e?

В любом случае, для кода, как написано, непредсказуемо, будет ли первый или второй отсканированный номер g->v. И g->e остается неинициализированным, но вы используете его в более позднем цикле.

Кроме того, как BSH отметил в удаленном ответе, sizeof((g->v)*(g->v)) будет оценивать до 4 на большинстве современных машин. Вы хотите: malloc(g->v * g->e * sizeof(int)). И вы хотите, чтобы adj был int*, а не int**.

Используйте valgrind или address sanitizer, чтобы найти исправления ошибок, подобных этому.

+0

Да, вы правы, он должен был g-> e –

Смежные вопросы