传递数组的C大小

时间:2011-03-30 22:33:04

标签: c arrays function sizeof

  

可能重复:
  How to find the sizeof( a pointer pointing to an array )

我知道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;
}

7 个答案:

答案 0 :(得分:14)

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

但是你有很多选择:

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

答案 1 :(得分:6)

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

void printarray( double p[], int s )

甚至

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

将其中任何一个转换为

void printarray( double* p, int s )

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

答案 2 :(得分:5)

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

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

因此,当您致电T时,printarray的类型会从“{1}}的100个元素数组”隐式转换为“指向array1的指针”。因此,参数double的类型为double,而不是p

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

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

答案 3 :(得分:1)

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

将长度作为参数传递是一个很好的解决方案,否则你可以确保你的数组总是以一些特殊值结束(比如字符串和空字节)。

答案 4 :(得分:0)

您可以使用Sentinel值,这是处理字符串的方式。缺点是你必须迭代整个数组才能找到它的大小。

例如,当你有一个字符串,如:

char s1[] = "foobar";

你实际拥有的是一个长度为7的数组,第七个点是一个空终止字符'\ 0',用于表示数组/字符串的结尾。

你可以做的另一种方法是创建一个结构,它由一个大小后跟数组组成。

答案 5 :(得分:0)

你必须

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

答案 6 :(得分:0)

如果您的数组以null结尾,那么您可以遍历数组并找到最后一个值。 C中的许多字符串运算符都是这样的

否则你没有太多选择。

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