参考文章:c中自定义函数通过sizeof来输出数组的长度为何不正确?【原创】
错误原因
我们可以使用sizeof(arr) / sizeof(arr[0])求数组长度,但是要注意:sizeof()函数是求数组所占的内存空间大小(不是长度)。当在函数中使用该方法求数组长度时,由于数组作为函数参数传入函数的过程中会“退化”为指针,因此将会导致sizeof(arr)求出的是一个指针的内存空间大小,而非数组的内存空间大小–>从而导致计算的长度错误
int *findPrime(int *arr, int len) {
int i = 0;
//cout << sizeof(arr); //会输出8字节,而不是24字节
//cout << sizeof(arr[0]); //会输出4
/*
int arr[] = {10,20,30,3,12,14};
int *p = arr; //会输出8字节,与上面的sizeof(arr)一样,证明确实是该问题导致的错误
cout << sizeof(p);
*/
while(i <= len) {
if(isPrime(*(arr + i))) {
return arr + i;
}
i++;
arr = arr + i;
}
return NULL;
}
解决办法
在声明数组之后就计算出数组长度,然后将数组长度作为函数参数也一起传入
如:
int arr[] = {10,20,30,3,12,14};
int len = sizeof(arr) / sizeof(arr[0]);
int *find = findPrime(arr, len);