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

Swa*_*and 11 c arrays

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

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

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

}

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

  length=ArraySize(MyArray);

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

}
Run Code Online (Sandbox Code Playgroud)

长度应该是5,因为它包含5个元素,虽然它的大小是8(即使8会做,但5会很好)

我试过这个:

int ArraySize(int * Array)
{

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

}
Run Code Online (Sandbox Code Playgroud)

这将无效,因为" sizeof(Array)"将重新调整Int指针的大小.这个" sizeof"只有你在同一个功能时才有效.

实际上我从C#开始很多天回到C所以我不记得了(和失踪Array.Length())

问候!

Dev*_*lar 29

当你拥有的只是一个指针时,你无法计算数组的大小.

使这个"类似函数"的唯一方法是定义一个宏:

#define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] ) )
Run Code Online (Sandbox Code Playgroud)

当然,这包含了所有常见的宏注意事项.

编辑:(以下评论真的属于答案...)

  1. 无法确定元素的数量初始化数组内,除非你先初始化为"无效"值的所有元素和人工手动操作的"有效"值计数.如果你的数组被定义为有8个元素,那么对于编译器它有8个元素,无论你是否只初始化了5个元素.
  2. 无法确定该数组作为参数传递到的函数中的数组大小.不是直接的,不是通过宏,不是以任何方式.您只能在声明的范围内确定数组的大小.

一旦您意识到这sizeof()是一个编译时操作符,就可以理解在被调用函数中确定数组大小的不可能性.它可能看起来像运行时函数调用,但它不是:编译器确定操作数的大小,并将它们作为常量插入.

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

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

您可以切换到C++并使用<vector>.你可以定义一个struct vector加号函数处理它,但它不是很舒服:

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

底线:C阵列有限.您无法在子功能期间计算其长度.您必须围绕该限制编写代码,或使用其他语言(如C++).


pax*_*blo 11

一旦数组衰减到指针,就不能这样做 - 你总是得到指针大小.

你需要做的是:

  • 如果可能,使用sentinel值,如指针为NULL或正数为-1.
  • 当它仍然是一个数组时计算它,并将该大小传递给任何函数.
  • 与上面相同,但使用时髦的宏魔法,如:
    #define arrSz(a) (sizeof(a)/sizeof(*a)).
  • 创建自己的抽象数据类型,它将长度保持为结构中的项目,这样您可以获得自己的Array.length().

  • @SwanandPurankar:不确定你究竟是什么意思,但在C中,`void foo(int [] arr)`和`void foo(int*ptr)`是同一个.因此,传递给函数*的数组总是*衰减到指针(到数组的第一个元素). (5认同)