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

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

我将传递一个数组作为输入,它应该返回它的长度。 我想要一个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); } 

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

我试过这个:

 int ArraySize(int * Array) { return (sizeof(Array)/sizeof(int)); } 

这将无效,因为“ sizeof(Array) ”将重新调整Int指针的大小。 只有当你处于相同的function时,这个“ sizeof ”的东西才有效。

实际上我从C#开始很多天后回到C所以我不记得了(并且缺少Array.Length()

问候!

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

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

 #define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] ) ) 

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

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

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

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

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

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

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

 #include  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; } 

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

一旦数组衰减到指针,你就无法做到这一点 – 你总是得到指针大小。

你需要做的是:

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

你要求的东西根本无法做到。

在运行时,程序可用于数组的唯一信息是其第一个元素的地址。 甚至元素的大小也只是从使用数组的类型上下文中推断出来的。

在C中你不能因为数组在传递给函数时衰减成指针(第一个元素)。

但是在C ++中,您可以使用Template Argument Deduction来实现相同的function。

您需要传递长度作为附加参数(如strncpy )或零终止数组(如strcpy )。

存在这些技术的小变化,比如将长度与指针捆绑在自己的类中,或者使用不同的标记来表示数组的长度,但这些基本上是您唯一的选择。

 int getArraySize(void *x) { char *p = (char *)x; char i = 0; char dynamic_char = 0xfd; char static_char = 0xcc; while(1) { if(p[i]==dynamic_char || p[i]==static_char) break; i++; } return i; } int _tmain(int argc, _TCHAR* argv[]) { void *ptr = NULL; int array[]={1,2,3,4,5,6,7,8,9,0}; char *str; int totalBytes; ptr = (char *)malloc(sizeof(int)*3); str = (char *)malloc(10); totalBytes = getArraySize(ptr); printf("ptr = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(int))); totalBytes = getArraySize(array); printf("array = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(int))); totalBytes = getArraySize(str); printf("str = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(char))); return 0; } 

已经很晚了。 但是我找到了解决这个问题的方法。 我知道这不是正确的解决方案,但如果你不想遍历整个数组的整数,它可以工作。

检查’\ 0’在这里不起作用

首先,在初始化时将任何字符放在数组中

 for(i=0;i<1000;i++) array[i]='x'; 

然后在传递值后检查'x'

 i=0; while(array[i]!='x') { i++; return i; } 

让我知道它是否有用。

要确定数组的大小(以字节为单位),可以使用sizeof运算符:

 int a[]; int n = sizeof(a); 

为了确定数组中元素的数量,我们可以将数组的总大小除以数组元素的大小。 您可以使用类型执行此操作,如下所示:

 int a[]; int n = sizeof(a) / sizeof(int); 

注意:在上面的尖括号内输入所需的大小。

C中arry的大小是:

 int a[]={10,2,22,31,1,2,44,21,5,8}; printf("Size : %d",sizeof(a)/sizeof(int));