传递数组的C大小

Unt*_*med 19 c arrays function sizeof

可能重复:
如何查找sizeof(指向数组的指针)

我知道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;
}
Run Code Online (Sandbox Code Playgroud)

Dig*_*oss 16

没有神奇的解决方案.C不是反思语言.对象不会自动知道它们是什么.

但是你有很多选择:

  1. 显然,添加一个参数
  2. 将呼叫包裹在宏中并自动添加参数
  3. 使用更复杂的对象.定义包含动态数组以及数组大小的结构.然后,传递结构的地址.

  • 您可以将指针传递给数组 `printarray( double (*p)[100])`,调用 `printarray(&amp;array1)`,这样您就可以通过 `*p` 引用您的数组并使用 `sizeof *p` (2认同)

asc*_*ler 5

函数参数实际上从不具有数组类型.当编译器看到

void printarray( double p[], int s )
Run Code Online (Sandbox Code Playgroud)

甚至

void printarray( double p[100], int s )
Run Code Online (Sandbox Code Playgroud)

它将任何一个转换为

void printarray( double* p, int s )
Run Code Online (Sandbox Code Playgroud)

所以sizeof(p)sizeof(double*).是的,您必须将大小作为参数传递.


Joh*_*ode 5

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

除非它是sizeof或一元运算&符的操作数,或者它是用于初始化声明中的另一个数组的字符串文字,"array of T" 类型的表达式将转换为"指向T"的类型,其值将为数组的第一个元素的地址.

因此,当您调用时printarray,类型array1将从"100元素数组double" 隐式转换为"指向double".因此,参数的类型pdouble *,不double [100].

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

这就是你必须分别传递数组大小的原因;