С точки зрения языка Си нет понятия «заполненный». Как только массив определен, ему выделяется память. Для массивов, таких как array1 (см. Пример ниже), элементы инициализируются равными 0. Однако для массивов, таких как array2, элементы могут иметь случайное значение.
Таким образом, понятие " заполнено " должно быть предоставлено программой. Один из возможных способов in-band :
(a) Выберите одно конкретное значение типа элемента (например, 0xFFFFFFFF) и используйте его для обнаружения свойства fill / empty каждого элемента массива (однако следует понимать, что этот подход убирает одно действительное значение в противном случае из набора элементов)
(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
$