无法在运行时解决堆损坏

时间:2013-07-12 13:28:35

标签: c pointers heap heap-corruption

我正在编写一个从文本文件中读取并尝试动态创建结构的程序。

所以我有以下代码来做到这一点:

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)在主函数中引起的。我知道问题是我正在破坏堆。我的指针算术可能是错误的,但我无法解决它。

我正在用linux编译gcc。

1 个答案:

答案 0 :(得分:3)

g_graph.adj = malloc(sizeof(Vertex *))仅为一个Vertex指针分配空间。只要执行vlist++,就会进入未分配的空间,并且未定义任何对该空间的使用。

您需要将第一个malloc调用更改为malloc(sizeof(Vertex *) * vertex_count)以正确分配空间。