遍历 C 中具有未知大小结构成员的结构数组



我知道stackoverflow.com上有很多类似的问题,但我无法为自己找到解决方案。经过一段时间的研究,我的大脑现在崩溃了,尽管我认为我想做的任务相对简单。

所以我有两个结构:

struct files_t {
file_t *file;
};
struct file_t {
unsigned char *bytes;
unsigned int len;
};
  • 第一个结构files_t包含未知数量的第二个结构file_t的结构。
  • 第二个结构file_t包含一个unsigned char数组,该数组表示file_t的字节和此bytes数组的长度。

然后我为自己创建一个指向files_t结构的指针:

files_t* files;

我现在的问题是:当file_t的数量在编译时未知并且每个file_t的大小在编译时未知时,我如何遍历这个files结构指针(伪代码:for each file in files(?

我现在

的问题是:(1((2(其中的file_ts量在编译时未知并且(3(每个file_t的大小在编译时未知时,我如何遍历此文件结构指针(伪代码:for each file in files(?

让我们从语句(3(开始:对你来说,好消息是每个file_t的大小在编译时是绝对已知的。它将是char *的大小,添加到整数的大小中,您可以在需要时使用sizeof(file_t).

不是坏消息:由于语句(2( 为真(其中的file_ts 的数量在编译时是未知的(,不幸的是,(1(的答案是:你不能。至少,你不能不修改一些东西。

为了知道您的struct files_t列表中有多少项(即有办法循环访问它(,您必须选择:

  1. struct files_t添加一个包含项目数的字段:
struct files_t {
file_t *file;
unsigned int nrOfFiles;
};

您将注意将其初始化为 0,在将文件添加到列表时递增它,并在从列表中删除文件时递减它。您可以使用带有类似for(int i=0; i<filesList.nrOfFiles; i++)的 for 循环来迭代它。

  1. 设计一个哨兵值。哨兵值意味着"这是数组的最后一个元素"。例如:
struct files_t {
file_t *file;
};
struct file_t {
unsigned char *bytes;
unsigned int len;
};
struct file_t fileArray =
{
{ charPointer0, len01 },
{ charPointer1, len1 },
/* ... */
{ charPointerN, lenN },
/* Sentinel */
{ NULL, 0 }
};
struct files_t fileList = { fileArray };

在这种情况下,您可以迭代直到找到{ NULL, 0 }元素。

问题不在于编译时,而在于执行时,几乎所有内容在编译时总是未知的。

您唯一的问题涉及数组中未知数量的元素,如果您无法获得这些数字,您可以标记每个数字的末尾:

  • 最后一个file_t可以有其字段bytes评估 NULL。我使用指针而不是len来允许您管理空文件
  • files_t数组中的最后一个指针可以是 NULL

最新更新