秋栈博客

七月

关于求数组元素个数的理解

5
2021-10-24
在复习C语言的数组时看到这么一行代码:
int len = sizeof(arr) / sizeof(arr[0]);
虽然知道这是求数组元素的个数,但一直不理解是怎么求出来的。今天在网上逛了一圈现在略知一二了。 用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。[tip type="info" ]sizeof()函数是求数组所占的内存空间大小(不是长度)[/tip]因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度。来看一个例子:
# include 
int main(void)
{   
    int a[10] = {0};
    printf("sizeof(a) = %d\n", sizeof(a));
    return 0;
}
数组a是int类型的,每个元素占4字节,所以长度为 10 的数组在内存中所占的字节数就是 40。而总的字节数除以一个元素所占的字节数就是数组的长度。

标准整数类型常见存储空间大小和取值范围

容易遇到的错误

当在函数中使用该方法求数组长度时,由于数组作为函数参数传入函数的过程中会“退化”为指针,因此将会导致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);

  • 0