传递数组的C大小

可能重复:
如何findsizeof(一个指向数组的指针)

我知道sizeof运算符是在编译时被评估和replace为一个常量。 既然如此,一个函数如何在一个程序的不同点上传递不同的数组,来计算它的大小呢? 我可以将它作为parameter passing给函数,但是如果不是绝对必须的话,我不需要添加其他参数。

下面是一个例子来说明我在问什么:

#include <stdio.h> #include <stdlib.h> #define SIZEOF(a) ( sizeof a / sizeof a[0] ) void printarray( double x[], int ); int main() { double array1[ 100 ]; printf( "The size of array1 = %ld.\n", SIZEOF( array1 )); printf( "The size of array1 = %ld.\n", sizeof array1 ); printf( "The size of array1[0] = %ld.\n\n", sizeof array1[0] ); printarray( array1, SIZEOF( array1 ) ); return EXIT_SUCCESS; } void printarray( double p[], int s ) { int i; // THIS IS WHAT DOESN"T WORK, SO AS A CONSEQUENCE, I PASS THE // SIZE IN AS A SECOND PARAMETER, WHICH I'D RATHER NOT DO. printf( "The size of p calculated = %ld.\n", SIZEOF( p )); printf( "The size of p = %ld.\n", sizeof p ); printf( "The size of p[0] = %ld.\n", sizeof p[0] ); for( i = 0; i < s; i++ ) printf( "Eelement %d = %lf.\n", i, p[i] ); return; } 

没有魔术解决scheme。 C不是reflection语言。 对象不会自动知道它们是什么。

但是你有很多select:

  1. 显然,添加一个参数
  2. 将调用包装在一个macros中,并自动添加一个参数
  3. 使用更复杂的对象。 定义一个包含dynamic数组和数组大小的结构。 然后,传递结构的地址。

函数参数从来不具有数组types。 当编译器看到

 void printarray( double p[], int s ) 

甚至

 void printarray( double p[100], int s ) 

它转换任何一个

 void printarray( double* p, int s ) 

所以sizeof(p)sizeof(double*) 。 是的,你将不得不通过大小作为参数。

问题是你的函数没有收到数组值; 它接收一个指针值。

除了是sizeof或unary &操作符的操作数,或者是在声明中用来初始化另一个数组的string,“ T ”数组的expression式将被转换为“指向T指针”types,它的值将是数组的第一个元素的地址。

因此,当您调用printarrayarray1的types被隐式地从“100元素的double数组”转换为“指向double指针”。 因此,参数p的types是double * ,而不是double [100]

在函数参数声明的上下文中, T a[]T *a相同。

这就是为什么你必须单独传递数组的大小。

您可以使用string处理方式的标记值。 缺点是你必须迭代整个数组才能find它的大小。

例如,当你有一个string如:

 char s1[] = "foobar"; 

你实际上有一个长度为7的数组,第七个点是一个空终止字符“\ 0”,用来表示数组/string的结尾。

你可以做的另一种方法是创build一个结构,其中包括一个大小,然后是数组。

你回答了你自己的问题。 它是在编译时计算的,那么'sizeof p'在运行时怎么可能有多个值呢?

将长度作为parameter passing是一个很好的解决scheme,否则你可以确保你的数组总是以一些特殊的值结束(比如string和空字节)。

你也要

  1. 将数组的大小作为parameter passing给函数
  2. 确保数组以已知值结束,并在达到该值时停止。

如果你的数组是空终止的,那么你可以遍历数组,并find最后一个值。 C中的许多string运算符就是这样工作的

否则,你没有太多的select。

sizeof将返回p的大小,这是一个指针,将等于你的int大小