我想做一个计算传递数组大小的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> ;.你可以定义一个结构向量加上处理这个函数的函数,但它不是很舒服:
#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).