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



我正在尝试学习 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 循环为每个结构分配内存。如果有人可以帮助我,我将不胜感激。

我目前正在为第一个函数而苦苦挣扎。我知道我必须在第一个函数中为每个数据结构分配内存,但我不知道如何通过 for 循环为每个结构分配内存

由于 Graph 对象具有maxSize成员和指向Node的单个指针,并且Node其中没有链接,因此其目的显然是分配和初始化节点数组。

您需要为最初为空图形中的所有未使用节点提供合理的值。我建议NULL名称(尚未指定),NULLoutlist(即它是空的)和0outdegree.

我会通过为分配空间并将该空间中的所有字节归零的节点调用 calloc 来做到这一点。

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

就是这样,你完成了。

然而:

  • 您可能需要放入一些代码来检查table是否为非 null。Opinioins对此有所不同,通常我依靠平台的内存保护来获取它,但是如果您在嵌入式世界中,则可能不起作用。
  • 上面的代码严格来说不是可移植的,因为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;
    }
    

相关内容

  • 没有找到相关文章

最新更新