找到作为c中函数的参数接收的整数数组的大小

时间:2014-09-05 06:44:37

标签: c arrays

我想找到作为函数参数传递的整数数组的大小。 这是我的代码

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内找到整数数组的长度 但是我能够在array函数中找到main的大小。由于它是pointer传递的,因此无法在length中找到function try/catch

我确实有一个想法。我可以把它放在一个C块中(segmentation fault没有尝试捕获,只有jumpers这是OS依赖的)并循环直到我获得integer array

我可以使用其他任何方式查找function

中{{1}}的长度

4 个答案:

答案 0 :(得分:24)

你不能这样做。当你将一个数组传递给一个函数时,它会衰减成一个指向第一个元素的指针,此时就会知道它的大小。

如果你想知道传递给函数的数组的大小,你需要在衰减之前处理它并将该信息传递给数组,如:

void function (size_t sz, int *arr) { ... }
:
{
    int x[20];
    function (sizeof(x)/sizeof(*x), x);
}

答案 1 :(得分:5)

数组在传递时衰减为指针。

因此,只有将sizeof应用于原始数组时,sizeof才能找到数组的长度。

所以你需要将数组的长度作为函数的单独参数传递。

答案 2 :(得分:3)

将数组传递给函数时,其地址将作为指针传递给函数

因此void getArraySize(int arr[])相当于void getArraySize(int* arr)

因此,sizeof(arr)会产生sizeof(int*),这可能是你想要的。

您只能在sizeof(arr)/sizeof(arr[0])的声明范围内安全地使用arr

在您的情况下,arr的声明范围是函数main

答案 3 :(得分:2)

无法确定函数内部的长度。无论您传递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
}

计算数组大小的一般方法 -

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