查找作为c 中函数的参数接收的整数数组的大小
我想找到作为函数的参数传递的整数数组的大小。 这是我的代码
void getArraySize(int arr[]){ int len = (sizeof(arr)/sizeof(arr[0]) printf("Array Length:%d\n",len); } int main(){ int array[] = {1,2,3,4,5}; getArraySize(array); return 0; }
我收到以下警告
sizeof on array function parameter will return size of 'int *' instead of 'int []' [-Wsizeof-array-argument]
请帮助,以便我可以在function
getArraySize
找到整数数组的长度但是我能够在main
函数中找到array
的大小。因为它是作为pointer
传递的,所以我无法在function
。
我确实有一个想法。我可以把它放在一个try/catch
块( C
没有try catch,只有依赖OS的跳线 )并循环直到我得到一个segmentation fault
。
有没有其他方法可以用来找到function
内部的integer array
的长度
你不能这样做。 将数组传递给函数时,它会衰减为指向第一个元素的指针,此时会丢失对其大小的了解。
如果你想知道传递给函数的数组的大小,你需要在衰减之前解决它并将该信息传递给数组,例如:
void function (size_t sz, int *arr) { ... } : { int x[20]; function (sizeof(x)/sizeof(*x), x); }
传递时,数组衰减为指针。
因此,只有将sizeof应用于原始数组时,sizeof才能找到数组的长度。
所以你需要将数组的长度作为函数的单独参数传递。
将数组传递给函数时,其地址作为指针传递给函数。
因此void getArraySize(int arr[])
等效于void getArraySize(int* arr)
。
结果, sizeof(arr)
产生sizeof(int*)
,这可能不是你想要的。
您只能在arr
声明的范围内安全地使用sizeof(arr)/sizeof(arr[0])
。
在您的情况下, arr
的声明范围是函数main
。
无法确定函数内部的长度。 但是,如果传递arr
, sizeof(arr)
将始终返回指针大小。 因此,最好的方法是将元素的数量作为单独的参数传递。
sizeof
仅用于在将数组应用于原始数组时查找数组的长度。
int arr[5]; //real array. NOT a pointer sizeof(arr); // :)
但是,当数组衰减成指针时,sizeof将给出指针的大小而不是数组的大小。
void getArraySize(int arr[]){ sizeof(arr); // will give the pointer size }
有一些理由说明为什么会发生这种情况。 我们怎样才能让C数组知道它的长度呢?
第一个想法是,当数组传递给函数并继续将数组长度保持在类型系统中时,数组不会衰减为指针。
将数组传递给函数时,它会衰减为指针。 所以sizeof
函数将返回int *
的大小。 这是你的编译器对以下内容进行编辑的警告:
sizeof on array function parameter will return size of 'int *' instead of 'int []'
正如我建议你将数组传递给函数时,你需要传递元素数量 –
getArraySize(array, 5); // 5 is the number of elements in array
抓住它 –
void getArraySize(int arr[], int element){ // your stuff }
另外一般计算arrays大小的方法 –
void getArraySize(int arr[], int len){ // your stuff printf("Array Length:%d\n",len); } int main(){ int array[] = {1,2,3,4,5}; int len = (sizeof(arr)/sizeof(arr[0]); // will return the size of array getArraySize(array, len); return 0; }