使用函数计算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 我试过这个: int ArraySize(int * Array) { return (sizeof(Array)/sizeof(int)); } 这将不起作用,因为“sizeof(Array)”将返回Int指针的大小. 其实我从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). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |