2013-10-27 31 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 Overzealous代碼格式化擴展。必須停止使用它。 –

回答

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))。並且您希望adjint*,而不是int**

使用valgrindaddress sanitizer找到一個修復這樣的錯誤。

+0

是的,你是對的,它應該是g-> e –

相關問題