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

标签 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 循环为每个结构分配内存。如果有人能帮助我,我将不胜感激。

最佳答案

I'm currently struggling with the first function. I know that I have to allocate memory for each data structure in the first function, but I don't know how to malloc the memory for each struct through the for loop

由于您的 Graph 对象有一个 maxSize 成员和一个指向 Node 的指针,并且 Node 中没有链接,因此意图很明显供您分配和初始化节点数组。

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

我将通过为节点调用 calloc 来分配空间并将该空间中的所有字节归零来完成此操作。

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

就这样,你就完成了。

但是:

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

关于c - 在C中初始化图时如何分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951412/

相关文章:

c - 这个 C 程序有什么问题..?

c++ - 如何检测正确的函数调用对

Java - 如何在另一个列表中查找列表中的项目数

python - 在不同的属性上调用 del 时,对象的列表属性会发生变化

r - 使用网络堆积条形图可视化 Likert 响应 : how to compare between groups?

r - 如何绘制填充轮廓,z 轴是一个因素

c - 首乌树,最多能生几个 child ?

c - 为什么我不能将指向 char 缓冲区的指针传递给带有参数 char** 的函数

Python:包含元组和长整数的列表

python - 如何使用 pyqtgraph 获得简单的绘图