为C中的结构列表动态分配内存的正确方法

问题描述

我有一个包含边的结构:

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 );

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...