传递数组的C大小[重复]

Posted

技术标签:

【中文标题】传递数组的C大小[重复]【英文标题】:C sizeof a passed array [duplicate] 【发布时间】:2011-07-26 11:35:41 【问题描述】:

可能重复: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;

【问题讨论】:

Standard C gotcha -- 查看链接到的问题。 sizeof 在 C99 中不必在编译时进行评估 - VLA 可以与 sizeof 一起正常工作,并且它们的大小只能在运行时知道。 【参考方案1】:

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

但是你有很多选择:

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

【讨论】:

你可以传递一个指向数组printarray( double (*p)[100])的指针,调用printarray(&amp;array1),这样你就可以通过*p引用你的数组并使用sizeof *p【参考方案2】:

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

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

因此,当您调用printarray 时,array1 的类型会从“double 的 100 元素数组”隐式转换为“指向double 的指针”。因此,参数p 的类型是double *,而不是double [100]

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

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

【讨论】:

简洁明了,谢谢。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

void printarray( double p[], int s )

甚至

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

它将任一转换为

void printarray( double* p, int s )

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

【讨论】:

【参考方案5】:

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

否则你别无选择。

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

【讨论】:

【参考方案6】:

你必须要么

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

【讨论】:

【参考方案7】:

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

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

char s1[] = "foobar";

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

另一种方法是创建一个结构,该结构由一个大小和数组组成。

【讨论】:

以上是关于传递数组的C大小[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在方法中传递数组并获取它的大小[重复]

C ++ 11数组按引用传递,函数中没有大小

ref c ++的初始数组大小[重复]

Visual Studio C/C++ 数组大小未处理的异常堆栈溢出 [重复]

如何在不知道c中大小的情况下遍历数组[重复]

C ++创建一个向量大小的数组,然后将向量复制到C样式数组中[重复]