存储动态结构数组

时间:2015-01-31 21:39:44

标签: c++ c arrays pointers struct

我一直在研究一个利用动态结构阵列的项目。为了避免在自己的变量中存储结构数量(结构数),我一直在使用一个带有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跟踪其字符数组的长度。)

我的问题很简单,是一个指针数组(指向struct的指针)确实是必要的,还是可以用结构数组(指向struct的指针)完成?任何人都可以提供更好的方法来解决这个问题吗?

注意:解决方案与C C ++兼容非常重要。这是在包装库中使用的,它包装了一个C ++库,用于标准C。

提前谢谢大家!

2 个答案:

答案 0 :(得分:2)

您需要的是哨兵值,这是一个可识别的有效值,意味着什么都没有"。对于指针,标准的标记值为NULL

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

答案 1 :(得分:1)

是的,可以有一个结构数组,并且(至少)有一个定义的sentinel(在字符串末尾使用'\ 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)。