在C中初始化图时如何分配内存?

时间:2017-03-22 12:17:02

标签: c list graph malloc

我正在尝试用C学习图形,目前我正在尝试编写一个用给定数据结构初始化图形的函数。 所以我的结构是:

typedef struct linked list{
 int index;
 struct linked list *next;
} List;

typedef struct {
 char *name;
 List *outlist;
 int outdegree;
} Node;

typedef struct {
 int maxSize;
 Node *table;
} Graph;

我有三个功能:

int initialise_graph(Graph *mygraph, int maxSize)
{
}

int insert_graph_node(Graph *mygraph, int n, char *name)
{
}

int insert_graph_link(Graph *mygraph, int source, int target)
{
}

我目前正在努力解决第一个问题。 我知道我必须为第一个函数中的每个数据结构分配内存,但我不知道如何通过for循环malloc为每个结构的内存。如果有人可以帮助我,我感激不尽。

1 个答案:

答案 0 :(得分:0)

  

我目前正在努力解决第一个问题。我知道我必须为第一个函数中的每个数据结构分配内存,但是我不知道如何通过for循环来为每个结构的内存进行malloc

由于您的Graph对象具有maxSize成员且指向NodeNode的单个指针中没有链接,因此您可以明确分配和初始化数组节点。

您最初的空图表中的所有未使用节点都需要合理的值。我建议NULL表示名称(尚未指定),NULL表示outlist(即它为空),0表示outdegree

我会通过为分配空间的calloc调用calloc并将该空间中的所有字节归零来实现此目的。

int initialise_graph(Graph *mygraph, int maxSize)
{
    mygraph->maxSize = maxSize;
    mygraph->table = calloc(maxSize, sizeof *table);
    return 0;
}

就是这样,你已经完成了。

然而:

  • 您可能需要输入一些代码来检查table是否为空。 Opinioins在这方面有所不同,通常我依靠平台的内存保护来捡起它,但如果你在嵌入式世界中,那可能行不通。
  • 上述代码严格来说不是可移植的,因为NULL指针不需要用所有零字节的模式表示。如果这与您有关,请使用循环初始化节点。 (再次省略NULL检查)。

     mygraph->table = calloc(maxSize, sizeof *table);
     // Null check would go here
     for (i = 0 ; i < maxSize ; ++i)
     {
         table[i].name = NULL;
         table[i].outlist = NULL;
         table[i].outdegree = 0;
     }