C数组中有多少个元素已满

时间:2010-02-27 15:09:26

标签: c arrays size

如果你在C中有一个数组,你怎么知道它有多少被填充?

8 个答案:

答案 0 :(得分:3)

在C数组中,任何元素都是对象。它与Java中的不同之处在于,您首先必须将引用分配给指向对象。 C中的任何内容都像Java中的原始类型。

如果你在C中有一个指针数组,你可能会看到这与Java中的工作方式类似。您可以使用空指针来指定“未填充以指向对象”:

// creates an array of 10 pointers, and initializes all of
// them to null pointers. If you leave off "{ 0 }", you 
// have to manually initialize them!
struct foo *array[10] = { 0 };

然后你可以用

进行测试
if(array[i] == 0) {
  printf("Position %d does not point to an object!\n", i);
}

答案 1 :(得分:1)

你需要自己跟踪这个。没有“完整”的概念(或者介于两者之间的任何东西):你必须定义它。

当然,如果元素在数组中是连续的,您可以使用NULL元素来表示数组的“结束”,从而同时定义“完整”状态。

答案 2 :(得分:1)

我同意其他答案,但我建议你一种方法让你的工作更轻松。您可以像对象一样管理数组并控制数据的添加和删除。如果你实现了两个函数,一个用于添加元素,一个用于删除它们,使用适当的逻辑来管理碎片和多线程,你可以跟踪读取计数器的数组中的元素数量,这只能通过添加和删除来编写功能。因此,每次需要计算元素时都不必执行循环。

答案 3 :(得分:1)

从C语言的角度来看,没有“填充”的概念。一旦定义了数组,就会为其分配内存。对于像array1这样的数组(参见下面的示例),元素初始化为0.但是,对于像array2这样的数组,元素可以具有随机值。

因此,程序必须提供“已填充”的概念。一种可能的“带内”方式是:   (a)选择元素类型的一个特定值(例如0xFFFFFFFF)并使用它来检测每个数组元素的填充/空属性(但是,要意识到这种方法从元素集中夺走了一个其他有效的值。),   (b)将数组的所有元素“初始化”为程序范围内适当位置的不允许值。   (c)要查找数组填充级别,请计算有效元素的数量。

$ cat t2.c
#include <stdio.h>
#define N 10

typedef unsigned long int T;

static const T EmptyElementValue = 0xFFFFFFFF;
// Choose any suitable value above. However, the chosen value
// would not be counted as an "empty" element in the array.

static T array1[ N ];

void
printArray( T a[], size_t length )
{
    size_t i;
    for( i = 0; i < length; ++i )
    {
        printf( "%lu, ", a[ i ] );
    }
    printf( "\n" );
}

size_t
numFilledElements( T a[], size_t length )
{
    size_t fillCount = 0;
    size_t i;

    for( i = 0; i < length; ++i )
    {
        if( a[ i ] != EmptyElementValue )
        {
            fillCount += 1;
        }
    }

    return fillCount;
}

int main()
{
    T array2[ N ];
    size_t i;

    printArray( array1, N );
    printArray( array2, N );

    //------------------------------------------//

    // Make array2 empty
    for( i = 0; i < N; ++i )
    {
        array2[ i ] = EmptyElementValue;
    }

    // Use some elements in array2
    array2[ 2 ] = 20;
    array2[ 3 ] = 30;
    array2[ 7 ] = 70;
    array2[ 8 ] = 80;

    printf( "Number of elements \"filled\" in array2 = %u\n",
        numFilledElements( array2, N  ));

    // Stop using some elements in array2
    array2[ 3 ] = EmptyElementValue;

    printf( "Number of elements \"filled\" in array2 = %u\n",
        numFilledElements( array2, N ) );


    return 0;
}


$ gcc -Wall t2.c -o t2


$ ./t2
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 60225, 2280452, 1627469039, 1628881817, 2281060, 2280680, 1628304199, 1628881818, 47, 
Number of elements "filled" in array2 = 4
Number of elements "filled" in array2 = 3

$

答案 4 :(得分:0)

一切都已填满,所以答案就是数组的大小。数组是一个连续的内存段,因此它默认填充之前在该内存位置的任何内容。

但是你可能想知道它中有多少是你关心的数据,而不是随机数据。在这种情况下,除非你自己跟踪它,否则无法知道。

答案 5 :(得分:0)

从数组大小中减去空元素的数量。 ; - )

抱歉,没有办法(除了你保持跟踪),告诉我们是否修改过数组元素。

答案 6 :(得分:0)

你可以做一个while(yourArray != NULL)循环并通过循环只增加一个整数值,这应该告诉你。

答案 7 :(得分:0)

在C中,没有内置的方法可以知道有多少元素填充了您关心的数据。您需要自己构建它。如前所述,如果你有一个不代表任何东西的值(例如0),你可以:

  1. 计算没有此未定义值的元素。
  2. 如果填充的元素位于同一块内存中,则可以查找未定义的值(Sentinel)
  3. 另一方面,如果您需要表示数据的范围,您将需要一个标记数组来跟踪所设置的元素和那些不是:

    例如,如果您有一个包含32个或更少元素的数组,则只需要一个无符号整数来跟踪您的数组: 1100010 ......

    值:

    1 - &gt;设置

    2 - &gt;设置

    3 - &gt;没有设置

    4 - &gt;没有设置

    5 - &gt;没有设置

    6 - &gt;设置

    因此,无论何时填充元素,您都可以调用设置正确位的函数,以及何时使用#34;

    完成此操作后,您只需在标志数组上调用popcount即可。