C size的传递数组 [duplicate]

C sizeof a passed array [duplicate]

提问人:Untamed 提问时间:3/31/2011 最后编辑:CommunityUntamed 更新时间:7/26/2016 访问量:55271

问:

这个问题在这里已经有答案了:
12年前关闭。

可能的重复:
如何找到 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;
}
C 数组函数 大小

评论

0赞 Jon 3/31/2011
标准 C 问题 -- 请参阅链接到的问题。
0赞 Carl Norum 3/31/2011
sizeof不必在编译时对 C99 进行评估 - VLA 可以正常工作,并且它们的大小只能在运行时知道。sizeof

答:

0赞 Robert S. Barnes 3/31/2011 #1

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

例如,当您有一个字符串时,例如:

char s1[] = "foobar";

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

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

29赞 DigitalRoss 3/31/2011 #2

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

但是您有很多选择:

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

评论

2赞 Andrea993 5/11/2018
你可以传递一个指向数组的指针,调用这样你就可以通过以下方式引用你的数组printarray( double (*p)[100])printarray(&array1)*psizeof *p
1赞 Scott Duckworth 3/31/2011 #3

您必须

  1. 将数组的大小作为参数传递给函数
  2. 确保数组以已知值结尾,并在达到该值时停止。
1赞 Eric 3/31/2011 #4

如果数组以 null 结尾,则可以遍历数组并查找最后一个值。C 语言中的许多字符串运算符都是这样工作的

否则你别无选择。

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

15赞 aschepler 3/31/2011 #5

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

void printarray( double p[], int s )

甚至

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

它将其中任何一个转换为

void printarray( double* p, int s )

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

2赞 bobDevil 3/31/2011 #6

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

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

10赞 John Bode 3/31/2011 #7

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

除非它是 or 一元运算符的操作数,或者它是用于初始化声明中另一个数组的字符串文本,否则类型为“array of ”的表达式将转换为类型“pointer to”,其值将是数组的第一个元素的地址。sizeof&TT

因此,当您调用 时,类型 的类型从 “100-element array of ” 隐式转换为 “pointer to ”。因此,参数的类型是 ,而不是 。printarrayarray1doubledoublepdouble *double [100]

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

这就是为什么您必须单独传递数组大小的原因;

评论

0赞 AlexSp3 10/8/2021
简明扼要,谢谢。