如果你在C中有一个数组,你怎么知道它有多少被填充?
答案 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),你可以:
另一方面,如果您需要表示数据的范围,您将需要一个标记数组来跟踪所设置的元素和那些不是:
例如,如果您有一个包含32个或更少元素的数组,则只需要一个无符号整数来跟踪您的数组: 1100010 ......
值:
1 - &gt;设置
2 - &gt;设置
3 - &gt;没有设置
4 - &gt;没有设置
5 - &gt;没有设置
6 - &gt;设置
等
因此,无论何时填充元素,您都可以调用设置正确位的函数,以及何时使用#34; 34;您取消设置与其对应的位的数据。
完成此操作后,您只需在标志数组上调用popcount即可。