我想制作一个计算传递数组大小的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)
当然,这包含了所有常见的宏注意事项.
编辑:(以下评论真的属于答案...)
一旦您意识到这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
一旦数组衰减到指针,就不能这样做 - 你总是得到指针大小.
你需要做的是:
#define arrSz(a) (sizeof(a)/sizeof(*a)).Array.length().