我想找到作为函数参数传递的整数数组的大小。 这是我的代码
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
答案 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)
无法确定函数内部的长度。无论您传递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
}
计算数组大小的一般方法 -
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;
}