2013-07-12 3 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

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