1. 正确用法:在定义数组的同一作用域内
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]); // 正确:length = 5
- 原理:
sizeof(arr)
返回数组总字节数,sizeof(arr[0])
返回单个元素字节数。 - 限制:仅适用于原始数组,且必须在定义数组的同一作用域内使用。
2. 常见错误:数组作为函数参数传递时
void func(int arr[]) {
// 错误!此时arr是指针,sizeof(arr)返回指针大小(通常4或8字节)
int wrong_length = sizeof(arr) / sizeof(arr[0]);
}
- 原因:数组作为函数参数时会退化为指针,
sizeof(arr)
等价于sizeof(int*)
。 - 解决方案:必须额外传递数组长度:
void func(int arr[], int length) { /* 使用length */ }
3. 动态分配数组的情况
int *arr = malloc(5 * sizeof(int));
// sizeof(arr) 仍然是指针大小,无法获取数组长度!
- 必须手动维护长度,C语言没有内置机制跟踪动态数组大小。