在C语言开发中,获取数组长度是基础且常用的操作,但C语言不像部分高级语言有内置的数组长度属性,需要开发者通过特定方式计算,不同使用场景下的计算方式也存在差异。

一、基础场景:在数组定义的作用域内计算长度
当数组和获取长度的操作在同一个作用域时,最常用的方法是结合sizeof运算符计算。数组的总字节数等于单个元素的字节数乘以元素个数,因此用数组总字节数除以单个元素字节数就能得到长度。
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
// 计算数组总字节数
int total_size = sizeof(arr);
// 计算单个元素字节数
int elem_size = sizeof(arr[0]);
// 数组长度 = 总字节数 / 单个元素字节数
int len = total_size / elem_size;
printf("数组长度为:%dn", len);
return 0;
}
这种方法的原理是sizeof在作用于数组时,返回的是整个数组占用的内存字节数,而不是数组首元素的地址大小。需要注意的是,这里的arr必须是数组本身,不能是数组的指针。
二、数组作为函数参数时的长度计算问题
很多开发者会把数组作为参数传给函数,然后在函数内部尝试用sizeof计算长度,这种做法是错误的。因为C语言中数组作为函数参数传递时,会发生退化,数组名会被转换为指向数组首元素的指针。
#include <stdio.h>
// 错误示例:函数内用sizeof计算数组长度
void print_arr_len(int arr[]) {
// 这里的arr是指针,不是数组本身
int len = sizeof(arr) / sizeof(arr[0]);
printf("函数内计算的数组长度:%dn", len);
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printf("main内计算的数组长度:%dn", sizeof(arr)/sizeof(arr[0]));
print_arr_len(arr);
return 0;
}
在64位系统中,指针的大小通常是8字节,如果数组元素是int类型(4字节),那么上述函数内计算的结果会是2,而不是实际的5。因此如果需要在函数中使用数组长度,正确的做法是额外传递长度参数。
#include <stdio.h>
// 正确做法:额外传递数组长度参数
void print_arr(int arr[], int len) {
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
print_arr(arr, len);
return 0;
}
三、字符串数组的长度计算
如果是字符数组用来存储字符串,需要注意字符串末尾有隐含的