Mingw使用malloc作为struct

时间:2016-04-01 04:56:25

标签: c struct malloc

我刚刚在作业中遇到了malloc问题 //这是我的头文件

struct vertex_t {
    int id;
    char *label;

    /* A list of vertices representing incoming edges */
    List in;
    /* A List of vertices representing outgoing edges */
    List out;
};
struct graph_t {
    /* Number of vertices */
    int order;
    /* Numb er of edges */
    int size;
    Vertex vertices;
};

//我们不允许更改上面的头文件。在我的主文件中,如何在图形中显示顶点?

Graph new_graph(int order) {
    Graph graph;
    int i;
    graph=NULL;
    graph=(Graph)malloc(sizeof(Graph));
    assert(graph);
    graph->order=order;
    graph->size=0;
    graph->vertices=(Vertex*)malloc((order+100000)*sizeof(Vertex));//!!!!!!!!!!!!!!!!!!!this line!!!!
    for(i=0;i<order;i++){
        graph->vertices[i].label=(char*)malloc(MAX_LINE_LEN*sizeof(char));
        graph->vertices[i].in=NULL;
        graph->vertices[i].out=NULL;
    }
    return graph;
}

我只能在malloc中添加极大数字以防止内存泄漏。

2 个答案:

答案 0 :(得分:1)

很难看到所有错误,因为你没有提供完整的程序,但据我所知,你犯了这样的错误:

graph=(Graph)malloc(sizeof(Graph));
graph->vertices=(Vertex*)malloc((order+100000)*sizeof(Vertex));

GraphVertex似乎是指针类型,所以你应该这样做:

graph = malloc(sizeof(struct graph_t));
graph->vertices = malloc((order)*sizeof(struct vertex_t));

我认为Vertex是与struct vertex_t相关联的指针类型,而Graph是与标题中的struct graph_t相关联的指针类型。

我们不使用malloc()为指针本身分配内存,而是为它指向的数据分配内存。所以大小取决于数据。如果pType是指针类型,例如char *int *struct my_struct *,则sizeof(pType)将始终相同(32位程序为8或16位)例如,对于64位程序。)

答案 1 :(得分:0)

 Graph graph;
 graph = (Graph)malloc(sizeof(Graph));

这是第一个问题。观察正确的模式:

struct Foo { ... };

Foo* foo = malloc(sizeof(Foo)); // one way
foo = malloc(sizeof(*foo)); // the other way, handy when you are not sure what your type is

请注意如何传递 struct 的大小并返回指针

第二次分配也是如此:

graph->vertices = (Vertex*)malloc((order+100000)*sizeof(Vertex));

在你的代码中,GraphVertex都是指针,但你想分配指向结构,而不是指针。

此外,您将结果转换为Vertex*,但将其分配给Vertex。这应该引发编译器警告。您必须阅读,理解并消除所有警告,不例外。我建议您设置编译器,以便将警告视为错误。