关于求数组元素个数的理解
5
2021-10-24
在复习C语言的数组时看到这么一行代码:
标准整数类型常见存储空间大小和取值范围
int len = sizeof(arr) / sizeof(arr[0]);虽然知道这是求数组元素的个数,但一直不理解是怎么求出来的。今天在网上逛了一圈现在略知一二了。 用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。[tip type="info" ]sizeof()函数是求数组所占的内存空间大小(不是长度)[/tip]因为数组中每个元素的类型都是一样的,在内存中所占的字节数都是相同的,所以总的字节数除以一个元素所占的字节数就是数组的长度。来看一个例子:
# include数组a是int类型的,每个元素占4字节,所以长度为 10 的数组在内存中所占的字节数就是 40。而总的字节数除以一个元素所占的字节数就是数组的长度。int main(void) { int a[10] = {0}; printf("sizeof(a) = %d\n", sizeof(a)); return 0; }
标准整数类型常见存储空间大小和取值范围
容易遇到的错误
当在函数中使用该方法求数组长度时,由于数组作为函数参数传入函数的过程中会“退化”为指针,因此将会导致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
-
分享