我刚刚在作业中遇到了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中添加极大数字以防止内存泄漏。
答案 0 :(得分:1)
很难看到所有错误,因为你没有提供完整的程序,但据我所知,你犯了这样的错误:
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或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));
在你的代码中,Graph
和Vertex
都是指针,但你想分配指向结构,而不是指针。
此外,您将结果转换为Vertex*
,但将其分配给Vertex
。这应该引发编译器警告。您必须阅读,理解并消除所有警告,不例外。我建议您设置编译器,以便将警告视为错误。