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

时间:2011-12-05 10:42:37

标签: c arrays structure

说我有:

struct a b[4];
//i filled some elements of b

我需要知道b的非空元素的数量。 由于我不确定b是否恰好有4个非空元素,有没有办法做到这一点?

6 个答案:

答案 0 :(得分:3)

无法检索此信息。你必须自己跟踪你使用的元素数量。

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

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

递增计数器。

你可以将所有这些包装成一个结构,以便将计数器保持在数组附近。这允许您从函数返回数组和计数器:

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

答案 1 :(得分:2)

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

第一个是使用某种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].

答案 2 :(得分:1)

C中没有非空区别。 您描述为的内容可能是指未初始化的变量。

答案 3 :(得分:1)

您必须跟踪填充时使用的数组元素数量。请注意你必须(==必须)这样做,因为在c中,没有数组的绑定检查,所以你必须跟踪你没有超过数组的边界(你如果您不这样做,最终会得到一个未定义的行为,同时您可以轻松跟踪您使用的元素数量。

答案 4 :(得分:0)

C不会在其数组中产生任何开销,因此它不会存储包括元素计数在内的任何其他信息。有一个像样的c ++ std :: vector模板,如果你不想自己做(这可能很烦人),如果你愿意使用c ++,只需说:)

答案 5 :(得分:0)

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

另一种方法是你可以做的是保持一个变量,它具有结构中元素的数量。