Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
已传递数组的C大小_C_Arrays_Function_Sizeof - Fatal编程技术网

已传递数组的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 of
    T
    ”类型的表达式将转换为指向
    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