计算传递给函数的数组中的元素数

时间:2015-06-29 23:01:17

标签: c arrays function pointers

如果我不想传递元素的数量,我怎么能计算数组中元素的数量呢?

fun(a, sizeof(a)/sizeof(*a));

并收到

int fun(int a[], int limit)
{
}

3 个答案:

答案 0 :(得分:1)

  

如何计算数组中元素的数量

你不能。

  

如果我不想将元素数量作为另一个参数传递

你必须。

这是C,没有婴儿保姆或魔杖。如果你需要跟踪一条信息(比如阵列的长度),你必须自己动手。这种显式性是我们使用C的原因,因此我们知道完全正在进行什么,而编译器不会在我们的背后做出疯狂的事情。

你会看到这样的宏:

#define ARRAY_LENGTH(x)    (sizeof(x) / sizeof(x[0]))

要小心! 这仅适用于数组,其中大小在编译时已知。它将用于任意指针。

Linux内核以安全的方式提供此宏:

kernel.h

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr))

compiler-gcc.h

/* &a[0] degrades to a pointer: a different type from an array */
#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0]))

compiler.h

#define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b))

答案 1 :(得分:0)

如果你这样做:

main()
{
  int a[]={1,2,3};
  fun(a);
}
fun(int a[])
{
}

您没有将数组作为副本传递。它只是一个指向第一个元素在内存中的地址的指针。

但它会起作用:

#include <stdio.h>

int fun(int*, int);

int main(void)
{
    int a[] = {1,2,3,4,5,6,7};
    int si=sizeof(a)/sizeof(a[0]);
    int b=fun(a, si);
    return 0;
}

int fun(int ar[], int si)
{
    int i = 0;
    printf("size of a==%d\n",si);
    for(i=0; i<si; i++)
        printf("%d ",ar[i]);
}

答案 2 :(得分:0)

声明

int fun(int someArray[])

相当于

int fun(int *someArray)

也就是说fun收到的关于数组的唯一信息是指向第一个元素的指针。因此,确定数组大小的唯一方法(除了将大小作为单独的参数传递)是将一个sentinel放在数组的末尾。 sentinel是一个否则不会出现在数组中的值。

例如,以下代码使用值-1作为数组末尾的标记。

#include <stdio.h>

void fun(int a[])
{
    int i;
    for ( i=0; a[i] >= 0; i++ )
        printf("%d ", a[i]);
    printf( "\nArray has %d elements\n", i );
}

int main( void )
{
    int a[] = {1,2,3,4,5,6,7,-1};
    fun(a);
    return 0;
}

这实际上是字符串在C中的工作方式.NUL终结符'\0'在字符数组的末尾充当标记,因此字符串长度不必作为单独的参数传递给所有字符串字符串函数。