我将传递一个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())
问候!
解决方法
#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).
原文地址:https://www.jb51.cc/c/114850.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。