传递数组的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:
- 显然,添加一个参数
- 将调用包装在一个macros中,并自动添加一个参数
- 使用更复杂的对象。 定义一个包含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,它的值将是数组的第一个元素的地址。
因此,当您调用printarray
, array1
的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和空字节)。
你也要
- 将数组的大小作为parameter passing给函数
- 确保数组以已知值结束,并在达到该值时停止。
如果你的数组是空终止的,那么你可以遍历数组,并find最后一个值。 C中的许多string运算符就是这样工作的
否则,你没有太多的select。
sizeof将返回p的大小,这是一个指针,将等于你的int大小