2013-07-12 56 views
0

我正在編寫一個程序,該程序從文本文件中讀取並嘗試動態創建結構。運行時無法解決堆損壞問題

所以我有下面的代碼來做到這一點:

typedef struct tgraph { 
    int vertex_count; 
    int edge_count; 
    struct tvertex **adj; 
} Graph; 

typedef struct tvertex { 
    int n; /* vertex number */ 
    char course[255]; 
    struct tvertex *next; 
} Vertex; 

Graph g_graph; 

void create_graph(FILE *fd) 
{ 
    int vertex_count; 
    int edge_count; 
    fscanf(fd, "%i", &vertex_count); 
    fscanf(fd, "%i", &edge_count); 
    printf("Vertices: %i\n", vertex_count); 
    printf("Edges: %i\n", edge_count); 
    g_graph.vertex_count = vertex_count; 
    g_graph.edge_count = edge_count; 
    g_graph.adj = malloc(sizeof(Vertex *)); 
    Vertex **vlist = g_graph.adj; 
    int i; 
    for (i = 0; i < vertex_count; i++) { 
     Vertex *vertex = malloc(sizeof(Vertex)); 
     fscanf(fd, "%i,%[^\n]", &vertex->n, vertex->course); 
     printf("%i %s\n", vertex->n, vertex->course); 
     *vlist = vertex; 
     vlist ++;; 
    } 
} 

我調用這個函數create_graph並在運行時收到此錯誤

損壞雙鏈表:0x00000000007d7240

這是通過調用fclose(fd)在主函數中引起的。我知道問題是我正在腐化堆。我的指針算術可能是錯誤的,但我無法解決它。

我正在用gcc在linux下編譯。

回答

3

g_graph.adj = malloc(sizeof(Vertex *))只爲一個Vertex指針分配空間。只要您執行vlist++,就會進入未分配空間,並且未定義該空間的任何用途。

您需要將第一次malloc調用更改爲malloc(sizeof(Vertex *) * vertex_count)才能正確分配空間。

+0

太棒了,它的工作!謝謝,我拖着那樣的東西,但我不確定,但我不清楚。你的回答清除了我。 – kaneda