函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因

参考文章: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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值