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语言没有内置机制跟踪动态数组大小。