我一直在研究一个利用动态结构阵列的项目。为了避免在自己的变量中存储结构数量(结构数),我一直在使用一个带有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。
提前谢谢大家!
答案 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)。