存储结构的动态数组

Storing a Dynamic Array of Structures

我一直在从事一个使用动态结构数组的项目。为了避免将结构的数量存储在它自己的变量中(结构的数量),我一直在使用一个指向结构变量的指针数组,并带有 NULL 终止符。

例如,假设我的结构类型定义为:

typedef struct structure_item{
    /* ... Structure Variables Here ... */
} item_t;

现在假设我的代码有 item_t **allItems = { item_1, item_2, item_3, ..., item_n, NULL }; 并且所有 item_# 都是 item_t *.

类型

使用此设置,我就不必跟踪另一个告诉我项目总数的变量。相反,我可以根据需要确定项目总数:

int numberOfStructures;
for( numberOfStructures = 0;
     *(allItems + numberOfStructures) != NULL;
     numberOfStructures++
  );

这段代码执行时,会统计NULL之前的指针总数。

作为对比,这个系统类似于C风格的字符串;而跟踪结构总数类似于 Pascal 风格的字符串。 (因为 C 使用 NULL 终止的字符数组,而 Pascal 跟踪其字符数组的长度。)

我的问题很简单,指针数组(指向结构的指针)是否真的有必要,或者这可以用结构数组(指向结构的指针)来完成吗?谁能提供更好的方法来处理这个问题?

注意:解决方案与 C C++ 兼容很重要。这被用在一个包装器库中,该库正在包装一个 C++ 库以在标准 C 中使用。

提前谢谢大家!

您需要的是一个标记值,一个可识别的有效值,即"nothing"。对于指针,标准标记值是 NULL.

如果您想直接使用您的结构,您将需要确定类型 item_t 的标记值,并检查它。你来电。

是的,可以有一个结构数组,并且(至少)其中一个是定义的标记(即在字符串末尾使用的 '\0',以及你的 NULL 指针例)。

对于您的结构类型,您需要做的是保留该结构的一个或多个可能值(由其成员的一组值组成)以指示标记。

例如,假设我们有一个结构类型

struct X {int a; char *p};

然后定义一个函数

int is_sentinel(struct X x)
{
    return x.p == NULL;
}

这意味着任何成员 p 为 NULL 的结构 X 都可以用作标记(在这种情况下成员 a 无关紧要)。

然后循环寻找哨兵。

注意:要在 C 和 C++ 中兼容,结构类型需要兼容(例如 POD)。