存储结构的动态数组
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)。
我一直在从事一个使用动态结构数组的项目。为了避免将结构的数量存储在它自己的变量中(结构的数量),我一直在使用一个指向结构变量的指针数组,并带有 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)。