c-Mingw对结构使用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;
};

//我们不允许更改上面的头文件。在我的主文件中,如何对图中的顶点进行malloc?

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中添加非常大的数字来防止内存泄漏。

很难看到所有的错误,因为你没有给出一个完整的程序,但据我所见,你在以下几行中犯了一个错误:

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,对于64位程序为16)。

 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

请注意如何传入结构的大小并返回指针

第二次分配也会发生同样的情况:

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

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

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

相关内容

  • 没有找到相关文章

最新更新