2013-07-12 1 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로 컴파일 중입니다.

답변

3

라인 g_graph.adj = malloc(sizeof(Vertex *))은 하나의 Vertex 포인터에 대해서만 공간을 할당합니다. vlist++을 수행하자마자 할당되지 않은 공간으로 이동하고 그 공간의 사용은 정의되지 않습니다.

공간을 올바르게 할당하려면 먼저 malloc 호출을 malloc(sizeof(Vertex *) * vertex_count)으로 변경해야합니다.

+0

멋졌습니다. 고마워, 나는 그런 꼬리를 짓고 있었다. 그러나 나는 확실하지 않았다. 그리고 그것은 나에게 명백하지 않았다. 당신의 대답이 나를 알아 냈습니다. – kaneda

관련 문제