使用函数计算C中数组的长度

我想做一个计算传递数组大小的FUNCTION.

我将传递一个Array作为输入,它应该返回它的长度.我想要一个功能

int ArraySize(int * Array   /* Or int Array[] */)
{
   /* Calculate Length of Array and Return it */

}

void main()
{
  int MyArray[8]={1,2,3,5};
  int length;

  length=ArraySize(MyArray);

  printf("Size of Array: %d",length);

}

长度应为5,因为它包含5个元素,虽然它的大小是8
(即使8将做但5将是优秀的)

我试过这个:

int ArraySize(int * Array)
{

  return (sizeof(Array)/sizeof(int));

}

这将不起作用,因为“sizeof(Array)”将返回Int指针的大小.
这个“sizeof”的东西只有在你的功能相同的时候才起作用.

其实我从C#回到C后很多天,所以我不记得了(和Missing Array.Length())

问候!

解决方法

当你所有的都是int指针时,你不能计算int数组的大小.

使这个“类似功能”的唯一方法是定义一个宏:

#define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] )

)

当然,这里附带了所有通常的宏指令.

编辑:(下面的评论真的属于答案…)

>您不能确定数组中初始化的元素数量,除非首先将所有元素初始化为“无效”值,然后手动计算“有效”值.如果你的数组被定义为具有8个元素,编译器就有8个元素,无论你是否只初始化了5个元素.
>您不能确定该数组作为参数传递给该函数的数组的大小.不直接,不是通过宏,不是以任何方式.您只能确定其已声明的范围中的数组的大小.

一旦你知道sizeof()是一个编译时操作符,就不能确定一个调用函数中的数组的大小.它可能看起来像一个运行时函数调用,但它不是:编译器确定操作数的大小,并将其作为常量插入.

在范围内声明了数组,编译器具有它实际上是一个数组的信息,以及它有多少个元素.

在数组传递的函数中,所有编译器看到的都是一个指针. (请考虑使用许多不同的数组调用函数,并记住sizeof()是一个编译时操作符.

您可以切换到C并使用< vector&gt ;.你可以定义一个结构向量加上处理这个函数函数,但它不是很舒服:

#include <stdlib.h>

typedef struct
{
    int *  _data;
    size_t _size;
} int_vector;

int_vector * create_int_vector( size_t size )
{
    int_vector * _vec = malloc( sizeof( int_vector ) );
    if ( _vec != NULL )
    {
        _vec._size = size;
        _vec._data = (int *)malloc( size * sizeof( int ) );
    }
    return _vec;
}

void destroy_int_vector( int_vector * _vec )
{
    free( _vec->_data );
    free( _vec );
}

int main()
{
    int_vector * myVector = create_int_vector( 8 );
    if ( myVector != NULL && myVector->_data != NULL )
    {
        myVector->_data[0] = ...;
        destroy_int_vector( myVector );
    }
    else if ( myVector != NULL )
    {
        free( myVector );
    }
    return 0;
}

底线:C数组有限.您不能在子功能期间计算长度.你必须围绕这个限制编写你的方式,或使用不同的语言(如C).

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...