问题描述
我有一个包含边的结构:
struct edges {
int fromNodeID;
int toNodeID;
int edgeLabel;
};
还有一个包含这些元组列表的结构,称为图:
struct graph {
struct edges* Edges;
};
在下面的函数中,我试图将struct graph
初始化为一个指针,但是我不确定如何最好地使用它。似乎边缘数组是totalNumberOfEdges
应当动态分配的内容。我不确定在图结构中是否应存储指向边缘的指针数组或边缘的数组。
void Allocate(unsigned long totalNumberOfEdges) {
struct graph *Database = malloc(sizeof(struct graph),totalNumberOfEdges);
}
解决方法
您需要两种不同的分配方式:
struct graph *g = malloc(sizeof(struct graph));
g->edges = malloc(totalNumberOfEdges * sizeof(struct edge));
,
您可能希望您的Allocate
方法将指针返回到新分配的内存,所以首先要做的就是将函数原型更改为
struct graph *Allocate( unsigned long totalNumberOfEdges )
{
然后,您需要分配struct graph
实例:
struct graph *Database = malloc( sizeof *Database );
sizeof *Database
产生的结果与sizeof (struct graph)
相同,这意味着您不必重复输入类型信息。
一旦确认struct graph
实例已正确分配,就分配Edges
数组:
if ( Database )
Database->Edges = malloc( sizeof *Database->Edges * totalNumberOfEdges );
同样,sizeof *Database->Edges
得到的结果与sizeof (struct edges)
相同。
然后您需要做的就是返回新分配的对象:
return Database;
}
取消分配图形时,您将需要以相反的顺序进行操作。您可能需要编写一个Deallocate
函数来封装它:
void Deallocate ( struct graph *Database )
{
free( Database->Edges );
free( Database );
}
您将其称为:
struct graph *g = Allocate( numEdges );
// do stuff with g
Deallocate( g );