我想创建一个函数来计算传递数组的大小。
我将传递一个数组作为输入,它应该返回其长度。我想要一个函数
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);
}
长度应该是 5,因为它包含 5 个元素,尽管它的大小是 8
(即使 8 个也可以,但 5 个就更好了)
我试过这个:
int ArraySize(int * Array)
{
return (sizeof(Array)/sizeof(int));
}
这不会像“sizeof(Array)
" 将返回 Int 指针的大小。
这 ”sizeof
“只有当你处于相同的功能时,事情才有效。
实际上,我在离开 C# 好几天后又回到了 C,所以我不记得了(并且缺少Array.Length()
)
Regards!
当你只有一个指针时,你无法计算数组的大小。
使这个“类似函数”的唯一方法是定义一个宏:
#define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] ) )
当然,这伴随着宏的所有常见警告。
Edit:(下面的评论确实属于答案......)
- You cannot确定元素的数量已初始化在数组中,除非您首先将所有元素初始化为“无效”值并手动计算“有效”值。如果您的数组已定义为具有 8 个元素,则对于编译器来说,它具有 8 个元素,无论您是否只初始化了其中 5 个。
- You cannot确定函数中数组的大小(该函数已将数组作为参数传递给该函数)。不直接,不通过宏,不以任何方式。你可以only确定数组的大小在其已声明的范围内.
一旦您意识到,在被调用函数中确定数组大小的不可能性就可以理解sizeof()
is a 编译时操作员。它可能look就像运行时函数调用,但它不是:compiler确定操作数的大小,并将它们作为常量插入。
在声明数组的范围内,编译器拥有它实际上是一个数组的信息,以及它有多少个元素。
在传递数组的函数中,编译器看到的只是一个指针。 (考虑到该函数可能会被多次调用不同的数组,并记住sizeof()
is a 编译时运算符.
您可以切换到 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;
}
底线:C 数组是有限的。您无法在子函数 period 中计算它们的长度。您必须通过编码来绕过该限制,或者使用不同的语言(例如 C++)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)