我知道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_t
s量在编译时未知并且(3(每个file_t
的大小在编译时未知时,我如何遍历此文件结构指针(伪代码:for each file in files
(?
让我们从语句(3(开始:对你来说,好消息是每个file_t
的大小在编译时是绝对已知的。它将是char *
的大小,添加到整数的大小中,您可以在需要时使用sizeof(file_t)
.
不是坏消息:由于语句(2( 为真(其中的file_t
s 的数量在编译时是未知的(,不幸的是,(1(的答案是:你不能。至少,你不能不修改一些东西。
为了知道您的struct files_t
列表中有多少项(即有办法循环访问它(,您必须选择:
- 向
struct files_t
添加一个包含项目数的字段:
struct files_t {
file_t *file;
unsigned int nrOfFiles;
};
您将注意将其初始化为 0,在将文件添加到列表时递增它,并在从列表中删除文件时递减它。您可以使用带有类似for(int i=0; i<filesList.nrOfFiles; i++)
的 for 循环来迭代它。
- 设计一个哨兵值。哨兵值意味着"这是数组的最后一个元素"。例如:
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