查找作为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

无法确定函数内部的长度。 但是,如果传递arrsizeof(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; }