在C中的结构中存储多个数组

Posted

技术标签:

【中文标题】在C中的结构中存储多个数组【英文标题】:storing multiple arrays within a struct in C 【发布时间】:2013-08-12 19:09:34 【问题描述】:

我正在尝试在 C 中设计一个数据结构,我可以在其中存储多个数组,可能在一个结构中,其中每个数组的大小不同。例如:

typedef struct task_list

  int total_tasks;
  unsigned int *task_array
 task_list;

typedef struct node_list

  int total_nodes;
  task_list *array_node
 node_list;

因此,如果我有 5 个节点,那么 total_nodes 将是 5,我希望有 5 个后续数组,即 array_node[0]array_node[1] ... array_node[4]。每个数组都包含无符号整数(任务)。问题是这些数组中的每一个都拥有不同数量的任务(total_tasks in struct task_list),因此每个数组的大小都会不同。

如何为每个任务数组创建和分配内存?以后访问它们的最佳方式是什么?

【问题讨论】:

"... 我可以在一个结构中存储多个数组,其中每个数组的大小不同...",这是不可能的,因为你措辞它,但是你可以有一个 void 指针数组,指向不同大小(和长度)的不同数组。 使用你已有的结构,我看到的唯一问题是total_nodes 应该是total_task_lists。如果您足够认真地考虑,其他一切都是直截了当的。 【参考方案1】:

如果它们是一维数组,分配内存的最佳方法是通过 malloc。同样,由于它们是一维的,您可以通过数组表示法访问它们,注意不要超出 total_nodes 和 total_tasks 给出的范围。删除节点时使用 free 释放数组。如果数组节点变大,使用 realloc 使数组变大并保持旧指针不变。

【讨论】:

【参考方案2】:

你需要分配一个node_list,然后分配它的array_node来保存5个task_lists,然后分配每个task_lists的task_arrays来保存可变数量的任务(使用malloc(total_tasks) * sizeof(unsigned int)))。

【讨论】:

【参考方案3】:

你应该修改node_list,使它维护一个指向task_list的指针数组:

typedef struct node_list

  int total_nodes;
  task_list **array_node;
 node_list;

现在,如果您需要 5 个任务列表,则首先为 5 个指向 task_list 的指针分配空间。

node_list n;
n.total_nodes = 5;
n.array_node = malloc(n.total_nodes * sizeof(task_list *));

然后,您遍历每个array_node,并分配一个适当大小的task_list

for (i = 0; i < n.total_nodes; ++i) 
    n.array_node[i] = allocate_task_list(task_list_size(i));

然后,去ithtask_list

task_list *tl = n.array_node[i];

【讨论】:

以上是关于在C中的结构中存储多个数组的主要内容,如果未能解决你的问题,请参考以下文章

C语言结构体数组的定义

在 gml 数据结构中存储多个唯一数组

C语言中结构体的理解

如何使用 SqlDataReader 在结构数组中存储多个值

如何读取txt文件并存储在c中的结构数组中

从C中的函数返回具有多个可变长度数组的结构