在C语言中,没有内置函数可以直接获取数组的长度,因为数组在传递给函数时会退化为指针,丢失其原始大小信息,以下是几种计算数组长度的方法,适用于不同场景:

(图片来源网络,侵删)
方法1:使用 sizeof 运算符(适用于静态数组)
在编译时已知数组大小的情况下,可以通过 sizeof 计算数组长度:
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]); // 5
注意:
- 仅适用于静态数组(栈上分配的数组)。
- 不适用于函数参数(数组退化为指针,
sizeof返回指针大小,而非数组大小)。
方法2:手动传递数组长度(推荐)
在函数中处理数组时,显式传递数组长度是最安全的方式:
void printArray(int arr[], int length) {
for (int i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]);
printArray(arr, length); // 显式传递长度
return 0;
}
方法3:使用终止符(适用于字符串或特定结构)
对于以特定值(如 '\0' 的字符串)结尾的数组,可以通过遍历找到终止符:

(图片来源网络,侵删)
char str[] = "Hello";
int length = 0;
while (str[length] != '\0') {
length++;
}
// length = 5(不包含 '\0')
方法4:宏定义(适用于固定大小的数组)
如果数组大小固定,可以用宏定义避免重复计算:
#define LENGTH(arr) (sizeof(arr) / sizeof(arr[0]))
int main() {
int arr[] = {1, 2, 3, 4, 5};
printf("%d", LENGTH(arr)); // 输出 5
return 0;
}
方法5:动态数组(需额外记录长度)
对于动态分配的数组(如 malloc),必须手动维护长度:
int *arr = malloc(5 * sizeof(int)); int length = 5; // 必须单独记录 // 使用后... free(arr);
注意事项
-
避免常见错误:
void func(int arr[]) { int size = sizeof(arr) / sizeof(arr[0]); // 错误!arr 是指针 }正确做法:显式传递长度。
(图片来源网络,侵删) -
多维数组:
int matrix[3][4]; int rows = sizeof(matrix) / sizeof(matrix[0]); // 3 int cols = sizeof(matrix[0]) / sizeof(matrix[0][0]); // 4
| 场景 | 方法 | 示例 |
|---|---|---|
| 静态数组(编译时已知) | sizeof |
sizeof(arr)/sizeof(arr[0]) |
| 函数参数 | 显式传递长度 | void func(int arr[], int len) |
| 字符串 | 遍历终止符 | while(str[i] != '\0') |
| 动态数组 | 手动维护长度 | int length = 5; |
最佳实践:在函数中处理数组时,始终显式传递长度,避免依赖 sizeof 的陷阱。
