已传递数组的C大小
可能重复:已传递数组的C大小,c,arrays,function,sizeof,C,Arrays,Function,Sizeof,可能重复: 我知道sizeof运算符在编译时被计算并替换为常量。既然如此,一个函数在程序中的不同点被传递不同的数组,它的大小如何计算?我可以将它作为一个参数传递给函数,但是如果我不一定要添加另一个参数的话,我宁愿不添加另一个参数 下面是一个例子来说明我的问题: #include <stdio.h> #include <stdlib.h> #define SIZEOF(a) ( sizeof a / sizeof a[0] ) void printarray( do
我知道sizeof运算符在编译时被计算并替换为常量。既然如此,一个函数在程序中的不同点被传递不同的数组,它的大小如何计算?我可以将它作为一个参数传递给函数,但是如果我不一定要添加另一个参数的话,我宁愿不添加另一个参数 下面是一个例子来说明我的问题:
#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;
}
#包括
#包括
#定义SIZEOF(a)(SIZEOF a/SIZEOF a[0])
void printary(双x[],int);
int main()
{
双阵列1[100];
printf(“array1的大小=%ld.\n”,SIZEOF(array1));
printf(“数组1的大小=%ld.\n”,数组1的大小);
printf(“数组1[0]的大小=%ld。\n\n”,数组1[0]的大小];
打印阵列(array1,SIZEOF(array1));
返回退出成功;
}
无效打印数组(双p[],整数s)
{
int i;
//这是不起作用的,因此,我通过了考试
//作为第二个参数,我不希望这样做。
printf(“计算的p的大小=%ld。\n”,SIZEOF(p));
printf(“p的大小=%ld.\n”,p的大小);
printf(“p[0]的大小=%ld.\n”,p[0]的大小];
对于(i=0;i
您可以使用sentinel值,这是处理字符串的方式。缺点是您必须遍历整个数组才能找到它的大小
例如,当您有以下字符串时:
char s1[] = "foobar";
您实际拥有的是一个长度为7的数组,第七个点是一个以null结尾的字符“\0”,用于指示数组/字符串的结尾
另一种方法是创建一个由大小和数组组成的结构。没有神奇的解决方案。C不是反射语言。对象不会自动知道它们是什么 但你有很多选择:
如果数组以null结尾,则可以遍历数组并找到最后一个值 否则你别无选择
sizeof将返回p的大小,p是一个指针,它将等于int size函数参数实际上从来没有数组类型
void printarray( double p[], int s )
甚至
void printarray( double p[100], int s )
它将其中一个转换为
void printarray( double* p, int s )
因此
sizeof(p)
是sizeof(double*)
。是的,您必须将大小作为参数传递。您回答了自己的问题。它是在编译时计算的,那么在运行时,“sizeof p”怎么可能有多个值呢
将长度作为参数传递是一个很好的解决方案,否则您可以确保数组总是以一些特殊值(如字符串和空字节)结尾。问题在于函数不接收数组值;它接收指针值 除非它是
sizeof
或一元&
运算符的操作数,或者它是用于初始化声明中另一个数组的字符串文字,否则“array ofT
”类型的表达式将转换为指向T
的“指针”类型它的值将是数组第一个元素的地址
因此,当您调用printary
时,array1
的类型被隐式地从“double的100元素数组”转换为“指向double
”,因此,参数p
的类型是double*
,而不是double[100]
在函数参数声明的上下文中,ta[]
与T*a
相同
这就是为什么必须单独传递数组大小 标准C解答--请参阅链接到的问题。
sizeof
不必在C99中的编译时进行计算-VLA可以与sizeof
正常工作,它们的大小只能在运行时知道。您可以通过调用printarray(&array1)将指针传递到数组printary(double(*p)[100])
因此您可以通过*p
引用数组,并使用sizeof*p