我刚在作业中遇到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));
Graph
和Vertex
似乎是一个指针类型,所以您应该这样做:
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));
在代码中,Graph
和Vertex
都是指针,但您希望分配指向结构的指针,而不是指针。
此外,您将结果强制转换为Vertex*
,但将其分配给Vertex
。这本应引发编译器警告。你必须阅读、理解并消除所有警告,无一例外。我建议您设置编译器,以便将警告视为错误。