如何在C中获得结构数组中使用的元素数?

如何在C中获得结构数组中使用的元素数?,c,arrays,structure,C,Arrays,Structure,假设我有: struct a b[4]; //i filled some elements of b 我需要知道b中非空元素的数量。 由于我不确定b是否正好有4个非空元素,有没有办法做到这一点?没有办法检索此信息。你必须记录你自己使用的元素的数量 通常,C开发人员在数组旁边使用另一个整数值: struct a b[4]; int b_count; 每次填充数组中的元素时,递增计数器 您可以将所有这些都封装到一个结构中,以便使计数器靠近阵列。这允许您从函数返回数组和计数器: stru

假设我有:

struct a b[4];
//i filled some elements of b
我需要知道
b
中非空元素的数量。
由于我不确定
b
是否正好有4个非空元素,有没有办法做到这一点?

没有办法检索此信息。你必须记录你自己使用的元素的数量

通常,C开发人员在数组旁边使用另一个整数值:

struct a b[4];
int      b_count;
每次填充数组中的元素时,递增计数器

您可以将所有这些都封装到一个结构中,以便使计数器靠近阵列。这允许您从函数返回数组和计数器:

struct array {
    struct a values[4];
    int      count;
};
struct array b;

通常有两种方法可以做到这一点

第一个是有某种类型的sentinel值,表示数组元素未被使用。例如,如果将数量存储为整数,则可以使用值
-1
表示未使用该值

作为与您的情况更相关的示例:

struct a {
    int inUse;
    // all other fields in structure
};
并根据数组元素是否正在使用,将数组元素中的
inUse
设置为1或0

第二个是在数组之外维护额外的信息,以指示使用了哪些元素。如果使用信息稀疏,这可能是一个映射;如果可以保证活动元素在开始时是连续的,那么这可能只是一个计数

对于地图,您可以使用:

struct a b[4];
int inUse[4];    // shows inUse indication for each element.
对于更简单的计数变化:

struct a b[4];
int inUseAtStart;   // 0 thru 4 shows how many elements are in use,
                    //   starting at b[0].

在C中没有这种空的非空的区别。
您描述为空的东西可能指的是未初始化的变量

C不会在其数组中产生任何开销,因此它不会存储任何附加信息,包括元素计数。有一个不错的C++ STD::向量模板,如果你不想自己做(这可能是恼人的),如果你愿意使用C++,只说:(

< p>),你必须跟踪你填充数组时使用的元素的数量。请注意,您必须(==must)这样做,因为在c中,数组没有边界检查,因此您必须跟踪不超过数组边界的情况(如果不超过,则会导致未定义的行为),执行此操作时,您可以轻松跟踪使用了多少元素。

您可以做的一件事是在插入的最后一项后标记下一项。例如,您使用了2个元素,然后可以使用特定数据标记第三个元素,如
-1


另一种方法是保留一个变量,该变量包含结构中元素的计数

我是说,没有填充元素对不起,“没有填充”也没有任何意义。创建
b
时,将创建四个
struct a
元素。您需要在结构本身中了解它们是否“正在使用”/“已填充”-这取决于代码的语义(并且您需要以某种方式对它们进行初始化)。是的,确实如此。数组已初始化,但并非所有数组都已填充。